⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wal.c

📁 windows 网络编程。pdf文档
💻 C
📖 第 1 页 / 共 5 页
字号:
			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 + -