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

📄 finger3.cpp

📁 See Appendix B for a description of the programs included on this companion disk. RESOURCE.WRI iden
💻 CPP
字号:
// FINGER.CPP
// Functions used for Finger user information protocol queries.

#include "..\winsock.h"				// Winsock header file
#include "sockman3.h"					// Prototypes and constants
#include "global3.h"					// Global variables

BOOL FingerDialog(VOID)
	{
		DLGPROC lpfnDialogProc;
		BOOL bOkay;

		//	Create a dialog box for the user's entry		
		lpfnDialogProc = MakeProcInstance((DLGPROC)FingerDialogProc,
					hInstanceSockman);
		bOkay = DialogBox(hInstanceSockman,"IDD_FINGER",	hwndSockman,
					lpfnDialogProc);
		FreeProcInstance(lpfnDialogProc);

    if (bOkay == -1)
    	{
				wsprintf(szScratchBuffer, "Unable to create dialog box!");
				MessageBeep(0);
				MessageBox(hwndSockman, szScratchBuffer,
							"SockMan-FINGER QUERY", MB_OK|MB_ICONINFORMATION);
    		bOkay = FALSE;
    	}
			
		return(bOkay);
	}

BOOL _export CALLBACK FingerDialogProc(HWND hwndDlg, UINT iMessage,
			WPARAM wParam, LPARAM	lParam)
	{
		LPSTR lpHost;							// The most recently used host name or address
		
		switch(iMessage)
			{
				case WM_INITDIALOG:		// Initialize the dialog box
					lpHost = lstrlen(szFingerHost) ? szFingerHost : szHostName;
					SetDlgItemText(hwndDlg, IDC_FINGER_HOST, lpHost); 
					SetDlgItemText(hwndDlg, IDC_FINGER_USER, szFingerUser); 
					CenterWindow(hwndDlg);
					return(TRUE);
					
				case WM_CLOSE:				// Close the dialog box
					PostMessage(hwndDlg, WM_COMMAND, IDCANCEL, 0L);
					return(TRUE);
					
				case WM_COMMAND:			// Handle the command buttons 
					switch(wParam)
						{ 
							case IDOK:			// The OK button was clicked
								GetDlgItemText(hwndDlg, IDC_FINGER_HOST,
											(LPSTR)szFingerHost, MAX_HOST_NAME);
								GetDlgItemText(hwndDlg, IDC_FINGER_USER,
											(LPSTR)szFingerUser, MAX_USER_NAME);
								lstrcpy(szLookupText, szFingerHost);
								EndDialog(hwndDlg, TRUE);
								return(TRUE);
								
							case IDCANCEL:	// The Cancel button was clicked
								EndDialog(hwndDlg, FALSE);
								return(TRUE);
						}
					break;
			}
		return(FALSE);
	}

VOID LookupFingerHost(LPARAM lError)
	{
		// Sockman uses WSAAsyncGetServByName to fill szFingerBuffer with 
		// the service entry information. The function extracts the finger 
		// service port from szFingerBuffer before reusing the buffer to 
		// store the host entry information.

		if (WSAGETASYNCERROR(lError)) 				// If an error occurs, use the
			nFingerPort = htons(IPPORT_FINGER);	// well-known protocol port
		else
			nFingerPort = ((LPSERVENT)szFingerBuffer)->s_port;

		hFingerTask = LookupHostAsync(hwndSockman, szFingerHost, 
					szFingerBuffer, (LPDWORD)&dwFingerAddr);
				
		if (!hFingerTask)
			{
				wsprintf(szFingerBuffer, "Lookup failed: %s", (LPSTR)szFingerHost);
				MessageBeep(0);
				MessageBox(hwndSockman, szFingerBuffer, "SockMan - FINGER",
							MB_OK|MB_ICONSTOP);
			}
		return;
	}
		
BOOL FingerHostAsync(LPARAM lError)
	{
		int nErr;											// Error code from asynchronous lookup

    if (nErr = WSAGETASYNCERROR(lError)) 
			{
				MessageBeep(0);
				PaintWindow("Async lookup failed! Trying a blocking finger.");
				hFingerTask = TASK_BLOCK_FINGER;
				FingerHostBlocking();
				hFingerTask = 0;
				return(FALSE);
			}
			
		// All data required to perform the Finger query is available so do it.
		return(DoFingerOperation());	
	}
			
BOOL FingerHostBlocking(VOID)
	{
		LPSERVENT lpServiceEntry;				// Service information structure

		if (!LookupHostBlocking(hwndSockman, szFingerHost,
					(LPSTR)&szFingerBuffer, TASK_BLOCK_FINGER))
			return(FALSE);								// Failed to resolve the host address
		                                      
		// If getservbyname() fails, use the well-known port.
		if ((lpServiceEntry = getservbyname("finger", NULL)) == NULL)
			nFingerPort = htons(IPPORT_FINGER);	
		else
			nFingerPort = lpServiceEntry->s_port;
		
		// All data required to perform the Finger query is available so do it.	
		return(DoFingerOperation());
	}

BOOL DoFingerOperation(VOID)
	{
		PHOSTENT pHostEntry;					// Internet host information structure
		SOCKET nSocket;								// Socket number used by this program
		SOCKADDR_IN sockAddr;					// Socket address structure
		int nErr;											// Error code
		int nCharSent;								// Number of characters received
		int nCharRecv;								// Number of characters transmitted
		BOOL bOkay = FALSE;						// Status code for the Finger operation
		int nLength = 0;							// Length of returned Finger information
		
		// Data buffers 
		char szUser[MAX_HOST_NAME+MAX_USER_NAME+3];	// Finger query buffer
		char szFingerInfo[MAX_PRINT_BUFFER+1];			// Finger results buffer

		if ((nSocket = socket(PF_INET, SOCK_STREAM, DEFAULT_PROTOCOL)) !=
					INVALID_SOCKET)
			{
				pHostEntry = (PHOSTENT)szFingerBuffer;
				
				sockAddr.sin_family = AF_INET;					// Internet Address family
				sockAddr.sin_port = nFingerPort;
				sockAddr.sin_addr = *((LPIN_ADDR)*pHostEntry->h_addr_list);
				
				if (!connect(nSocket, (SOCKADDR *)&sockAddr, sizeof(sockAddr)))
					{
						wsprintf(szUser, "%s\r\n", (LPSTR)szFingerUser);
						
						if ((nCharSent = send(nSocket, szUser, lstrlen(szUser), 
									NO_FLAGS)) != SOCKET_ERROR)
							{
								do
									{
										nCharRecv = recv(nSocket,(LPSTR)&szFingerInfo[nLength],
													sizeof(szFingerInfo) - nLength, NO_FLAGS);
										nLength+=nCharRecv;
									}
								while (nCharRecv > 0);
										
								closesocket(nSocket);
						
								if (nCharRecv != SOCKET_ERROR)
									{
										// Null terminate the Finger buffer
										szFingerInfo[nLength] = '\0';	
										// Set the Scratch buffer to zero length
										szScratchBuffer[0] = '\0';		
											
										wsprintf(szScratchBuffer, "FINGER:\t%s@%s\n\n", 
													(LPSTR)szFingerUser, (LPSTR)szFingerHost);
										lstrcat(szScratchBuffer, szFingerInfo);
										PaintWindow(szScratchBuffer);
										MessageBeep(0);
										bOkay = TRUE;
									}
							}
					}
			}
		
		if (!bOkay)	
			{
				nErr = WSAGetLastError();
				closesocket(nSocket);
				wsprintf(szFingerInfo, "Error number %d", nErr);
				MessageBeep(MB_ICONSTOP);
				MessageBox(hwndSockman, szFingerInfo, "Finger Operation",
							MB_OK|MB_ICONSTOP);
			}
		return(bOkay);
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -