📄 wal.c
字号:
stWSAppData.nOobOutLen = 1;
stWSAppData.nOobInLen = stWSAppData.nLength;
stWSAppData.nOobInterval= stWSAppData.nLength;
stWSAppData.nLoopMax = stWSAppData.nLoopLimit;
stWSAppData.nLoopsLeft = stWSAppData.nLoopLimit;
stWSAppData.nLoopsUpMax = DFLT_LOOP_UP;
stWSAppData.nLoopsDnMax = DFLT_LOOP_DN;
/* reset stats */
SendMessage (hwnd, WM_COMMAND, IDM_RESETSTATS, 0L);
/* increase our message queue to the max available
* NOTE: this is just a precaution, but doesn't hurt */
for (nMsgQSize = 120;
((!SetMessageQueue(nMsgQSize)) && (nMsgQSize > 0));
nMsgQSize--);
CenterWnd(hwnd, NULL, TRUE);
break;
case WM_DESTROY:
/*---------------------------------
* Close main window & application
*-------------------------------*/
/* set offset to negative value to stop loop (only needed by BAD monolithic APPS) */
stWSAppData.wOffset = -1;
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hwnd, msg, wParam, lParam));
}
return 0;
} /* end WALWndProc() */
/*---------------------------------------------------------------------
* Function: WSAppOptDlgProc()
*
* Description:
* prompt user for winsock application parameters:
* - client or server
* - hostname or address (remote or local)
* - protocol (datagram or datastream)
* - opmode (blocking, non-blocking, asynch, asynch/nb)
*
* allocate memory for our winsock applications private data, and
* initialize the appriate fields, including application id field
* (with id number for window class).
*/
BOOL CALLBACK WSAppOptDlgProc (
HWND hDlg,
UINT msg,
UINT wParam,
LPARAM lParam)
{
static int nProtocol, nRole, nMode;
static int nNewService = FALSE, nNewPort = 0;
static HANDLE hInst = 0;
static HANDLE hwnd = 0;
struct servent FAR *lpServent;
FARPROC lpfnWSOptionProc;
switch (msg) {
case WM_INITDIALOG:
if (lParam) {
hInst = LOWORD(lParam);
hwnd = HIWORD(lParam);
}
switch (stWSAppData.nProtocol) {
case PROT_DG:
nProtocol = IDC_DATAGRAM;
break;
case PROT_DS:
nProtocol = IDC_DATASTREAM;
}
CheckRadioButton (hDlg, IDC_DATASTREAM, IDC_DATAGRAM, nProtocol);
switch (stWSAppData.nRole) {
case ROLE_CL:
nRole = IDC_CLIENTAPP;
break;
case ROLE_SV:
nRole = IDC_SERVERAPP;
}
CheckRadioButton (hDlg, IDC_CLIENTAPP, IDC_SERVERAPP, nRole);
switch (stWSAppData.nOpMode) {
case OPMODE_BL:
nMode = IDC_BLOCKING;
break;
case OPMODE_NB:
nMode = IDC_NONBLOCKING;
break;
case OPMODE_AS:
nMode = IDC_ASYNCH;
break;
}
CheckRadioButton (hDlg, IDC_BLOCKING, IDC_ASYNCH, nMode);
SetDlgItemInt(hDlg, IDC_PORTNUMBER, stWSAppData.nPortNumber, FALSE);
SetDlgItemText(hDlg, IDC_SERVICENAME, stWSAppData.szService);
SetDlgItemText(hDlg, IDC_HOSTID, stWSAppData.szHost);
SetFocus (GetDlgItem (hDlg, IDC_HOSTID));
CenterWnd(hDlg, hwnd, TRUE);
return FALSE;
case WM_COMMAND:
switch (wParam) {
case IDOPTIONS:
/* Call the options dialog box to further qualify */
lpfnWSOptionProc = MakeProcInstance((FARPROC)WSIOOptDlgProc, hInst);
DialogBoxParam (hInst,
"IOOptionDlg",
hwnd,
lpfnWSOptionProc,
MAKELPARAM(hInst, hwnd));
FreeProcInstance((FARPROC) lpfnWSOptionProc);
/* In options user can select Read/Write capabilities, which may cause
* us to select different default services ...so refresh relevant items */
SetDlgItemInt(hDlg, IDC_PORTNUMBER, stWSAppData.nPortNumber, FALSE);
SetDlgItemText(hDlg, IDC_SERVICENAME, stWSAppData.szService);
return TRUE;
case IDCANCEL:
EndDialog (hDlg, FALSE);
return FALSE;
case IDOK:
/* get the new values (if there are any) */
GetDlgItemText (hDlg, IDC_HOSTID, stWSAppData.szHost, MAX_NAME_SIZE);
if (nNewService)
GetDlgItemText (hDlg, IDC_SERVICENAME, stWSAppData.szService, MAX_NAME_SIZE);
if (nNewPort)
stWSAppData.nPortNumber =
(u_short)GetDlgItemInt (hDlg, IDC_PORTNUMBER, NULL, FALSE);
EndDialog (hDlg, TRUE);
return TRUE;
case IDC_HOSTID: /* BQ NOTE: might want to resolve it.
If so, might need an IP Addr field */
return TRUE;
case IDC_SERVICENAME: /* new service name, let's resolve it! */
switch (HIWORD (lParam)) {
static BOOL nChanged = FALSE;
case EN_UPDATE:
nChanged = TRUE;
return FALSE;
case EN_KILLFOCUS:
if (nChanged) {
GetDlgItemText (hDlg, IDC_SERVICENAME, achInBuf, MAX_NAME_SIZE);
lpServent = getservbyname (achInBuf, /* get port number from service name */
(LPSTR) (stWSAppData.nProtocol == PROT_DS ? "tcp" : "udp"));
if (lpServent) { /* points to servent struct if successful (else NULL) */
nNewPort = ntohs(lpServent->s_port);
SetDlgItemInt(hDlg, IDC_PORTNUMBER, nNewPort, FALSE);
nNewService = TRUE;
} else {
SetDlgItemText(hDlg, IDC_PORTNUMBER, "<unknown>");
nNewPort = 0;
nNewService = FALSE;
}
}
default:
return FALSE;
}
case IDC_PORTNUMBER: /* new port number, let's resolve it! */
switch (HIWORD (lParam)) {
static BOOL nChanged = FALSE;
case EN_UPDATE:
nChanged = TRUE;
return FALSE;
case EN_KILLFOCUS:
if (nChanged) {
nNewPort = GetDlgItemInt (hDlg, IDC_PORTNUMBER, NULL, FALSE);
lpServent = getservbyport (htons((u_short)nNewPort), /* get service name from port # */
(LPSTR) (stWSAppData.nProtocol == PROT_DS ? "tcp" : "udp"));
if (lpServent) { /* points to servent struct if successful (else NULL) */
SetDlgItemText (hDlg, IDC_SERVICENAME, lpServent->s_name);
nNewService = TRUE;
} else {
SetDlgItemText (hDlg, IDC_SERVICENAME, "<unknown>");
nNewService = FALSE;
}
}
default:
return FALSE;
}
case IDC_DATASTREAM:
stWSAppData.nProtocol = PROT_DS;
return TRUE;
case IDC_DATAGRAM:
stWSAppData.nProtocol = PROT_DG;
return TRUE;
case IDC_CLIENTAPP:
stWSAppData.nRole = ROLE_CL;
if (stWSAppData.nIoMode == IOMODE_RW) /* fix I/O order, if necessary */
stWSAppData.nIoMode = IOMODE_WR;
return TRUE;
case IDC_SERVERAPP:
stWSAppData.nRole = ROLE_SV;
if (stWSAppData.nIoMode == IOMODE_WR) /* fix I/O order, if necessary */
stWSAppData.nIoMode = IOMODE_RW;
return TRUE;
case IDC_BLOCKING:
stWSAppData.nOpMode = OPMODE_BL;
return TRUE;
case IDC_NONBLOCKING:
stWSAppData.nOpMode = OPMODE_NB;
return TRUE;
case IDC_ASYNCH:
stWSAppData.nOpMode = OPMODE_AS;
return TRUE;
}
break;
}
return FALSE;
} /* end WSAppOptDlgProc() */
/*---------------------------------------------------------------------
* Function: WSIOOptDlgProc()
*
* Description: I/O option dialog procedure to:
* - select read and/or write
* - turn on or off the I/O sound
* - set read/write amounts
* - set I/O loop parameters
*/
BOOL CALLBACK WSIOOptDlgProc (
HWND hDlg,
UINT msg,
UINT wParam,
LPARAM lParam)
{
static int nReadFlag, nWriteFlag, nWinTimer;
static HANDLE hwnd, hInst;
static BOOL bSound;
FARPROC lpfnWSIOAdvProc;
switch (msg) {
case WM_INITDIALOG:
/* get parameters passed */
if (lParam) {
hInst = LOWORD(lParam);
hwnd = HIWORD(lParam);
}
/* init local work variables from actual values */
nReadFlag = ((stWSAppData.nIoMode==IOMODE_R) ||
(stWSAppData.nIoMode==IOMODE_WR) ||
(stWSAppData.nIoMode==IOMODE_RW));
nWriteFlag = ((stWSAppData.nIoMode==IOMODE_W) ||
(stWSAppData.nIoMode==IOMODE_WR) ||
(stWSAppData.nIoMode==IOMODE_RW));
bSound = (stWSAppData.nOptions & OPTION_SOUND);
/* set display values */
CheckDlgButton (hDlg, IDC_READ, nReadFlag);
CheckDlgButton (hDlg, IDC_WRITE, nWriteFlag);
CheckDlgButton (hDlg, IDC_SOUND, bSound);
SetDlgItemInt (hDlg, IDC_BYTES_PER_IO, stWSAppData.nLength, FALSE);
SetDlgItemInt (hDlg, IDC_IO_PER_LOOP, stWSAppData.nLoopLimit, FALSE);
SetDlgItemInt (hDlg, IDC_MAX_IO_PER_LOOP, stWSAppData.nLoopMax, FALSE);
SetDlgItemInt (hDlg, IDC_LOOP_INTERVAL, stWSAppData.nWinTimer, FALSE);
SetDlgItemInt (hDlg, IDC_MAXBYTES, stWSAppData.nBytesMax, FALSE);
SetFocus (GetDlgItem (hDlg, IDOK));
CenterWnd(hDlg, hwnd, TRUE);
return FALSE;
case WM_COMMAND:
switch (wParam) {
case IDCANCEL:
/* "Cancel" button pressed, so just leave (ignore any new values) */
EndDialog (hDlg, FALSE);
return TRUE;
case IDOK:
/* "OK" button pressed, so get the new values (if there are any) */
if (nReadFlag && nWriteFlag) {
if (stWSAppData.nRole == ROLE_CL) {
/* our client sends, then receives */
stWSAppData.nIoMode = IOMODE_WR;
} else {
/* our server receives, then sends */
stWSAppData.nIoMode = IOMODE_RW;
}
/* default service for client or server if both reading & writing */
stWSAppData.nPortNumber = ECHO_PORT;
_fmemcpy (stWSAppData.szService, "echo", 5);
} else if (nReadFlag) {
stWSAppData.nIoMode = IOMODE_R;
if (stWSAppData.nRole == ROLE_CL) {
/* default service for client to connect to when read-only */
stWSAppData.nPortNumber = CHARGEN_PORT;
_fmemcpy (stWSAppData.szService, "chargen", 8);
} else {
/* default service for server to provide when read-only */
stWSAppData.nPortNumber = DISCARD_PORT;
_fmemcpy (stWSAppData.szService, "discard", 8);
}
} else if (nWriteFlag) {
stWSAppData.nIoMode = IOMODE_W;
if (stWSAppData.nRole == ROLE_CL) {
/* default service for client to connect to when write-only*/
stWSAppData.nPortNumber = DISCARD_PORT;
_fmemcpy (stWSAppData.szService, "discard", 8);
} else {
/* default service for server to provide when write-only */
stWSAppData.nPortNumber = CHARGEN_PORT;
_fmemcpy (stWSAppData.szService, "chargen", 8);
}
}
if (!stWSAppData.nIoMode) /* if none selected, do both! */
stWSAppData.nIoMode = IOMODE_WR;
stWSAppData.nOptions |= OPTION_SOUND;
stWSAppData.nOptions &= (bSound ? OPTION_MASK : ~OPTION_SOUND);
stWSAppData.nLength =
GetDlgItemInt (hDlg, IDC_BYTES_PER_IO, NULL, FALSE);
stWSAppData.nLoopLimit =
GetDlgItemInt (hDlg, IDC_IO_PER_LOOP, NULL, FALSE);
stWSAppData.nLoopsLeft = stWSAppData.nLoopLimit;
stWSAppData.nLoopMax =
GetDlgItemInt (hDlg, IDC_MAX_IO_PER_LOOP, NULL, FALSE);
stWSAppData.nBytesMax =
(u_short) GetDlgItemInt (hDlg, IDC_MAXBYTES, NULL, FALSE);
/* Get timer value; maybe it's new!? */
nWinTimer = GetDlgItemInt (hDlg, IDC_LOOP_INTERVAL, NULL, FALSE);
/* If timer value changed, change things to use new value */
if (nWinTimer != stWSAppData.nWinTimer) {
if (stWSAppData.nSockState == STATE_CONNECTED) {
SetNewTimer(hwnd, stWSAppData.nWinTimer, nWinTimer);
}
stWSAppData.nWinTimer = nWinTimer; /* save the new timer value */
}
EndDialog (hDlg, TRUE);
return TRUE;
case IDC_READ:
nReadFlag = !nReadFlag;
return TRUE;
case IDC_WRITE:
nWriteFlag = !nWriteFlag;
return TRUE;
case IDC_SOUND:
bSound = !bSound;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -