📄 pagepeople.cpp
字号:
CString sIpAddress;
unsigned long ulIpAddress = 0x0;
hostent* phe;
char abHostName[255];
if((!gethostname(abHostName, sizeof(abHostName))) &&
((phe = gethostbyname(abHostName)) != NULL) &&
(phe->h_length == 4))
{
CopyMemory(&ulIpAddress, phe->h_addr, 4);
ulIpAddress &= 0x00ffffff;
CString sIP;
for(int i = 0; i < 255; i++)
{
if(phe = gethostbyaddr((LPCSTR)&ulIpAddress, 4, PF_INET))
{
pOwner->ItemInsert(phe->h_name);
in_addr inaddr;
inaddr.s_addr = ulIpAddress;
CString sIpAddress = inet_ntoa(inaddr);
}
ulIpAddress += 0x01000000;
}
}
g_AnimateWait->Play(0, 0, 0);
g_WriteToOutput(TRUE, "[People] Looking up hostnames finished...");
return 0;
}
/////////////////////////////////////////////////////////////////////////////
void CPagePeople::OnLocalNet()
{
AfxBeginThread(g_LocalNet, this);
g_WriteToOutput(TRUE, "[People] Looking up hostnames, please wait...");
}
/////////////////////////////////////////////////////////////////////////////
BOOL CPagePeople::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)
{
switch(GetFocus()->GetDlgCtrlID())
{
case IDC_FINGERSERVER:
AddServer();
break;
case IDC_FINGERUSER:
AddUser();
break;
case IDC_MINUTES:
m_Every.SetFocus();
break;
}
}
return CPropertyPage::PreTranslateMessage(pMsg);
}
/////////////////////////////////////////////////////////////////////////////
void CPagePeople::OnChangeFingerserver()
{
UpdateData();
CString sServer;
m_Server.GetWindowText(sServer);
CString sUser;
m_User.GetWindowText(sUser);
if(sServer != "")
GetDlgItem(IDB_FINGER)->EnableWindow(TRUE);
else
GetDlgItem(IDB_FINGER)->EnableWindow(FALSE);
if(sServer != "" && sUser != "")
GetDlgItem(IDB_FINGER_MANUAL)->EnableWindow(TRUE);
else
GetDlgItem(IDB_FINGER_MANUAL)->EnableWindow(FALSE);
}
/////////////////////////////////////////////////////////////////////////////
void CPagePeople::OnChangeFingeruser()
{
UpdateData();
CString sServer;
m_Server.GetWindowText(sServer);
CString sUser;
m_User.GetWindowText(sUser);
if(sUser != "" && sServer != "")
GetDlgItem(IDB_FINGER_MANUAL)->EnableWindow(TRUE);
else
GetDlgItem(IDB_FINGER_MANUAL)->EnableWindow(FALSE);
}
///////////////////////////////////////////////////////////////////////////////
// GetHostAddr -- gets host's internet address. Interprets argument first //
// as dotted internet address string, and failing that, as a DNS host name. //
///////////////////////////////////////////////////////////////////////////////
IPA g_GetHostAddr(char* szHostName)
{
IPA ipa;
HOSTENT FAR *phe; // pts to host info struct (internally allocated)
if((ipa = INET_ADDR(szHostName)) != INADDR_NONE)
return ipa;
if(phe = gethostbyname(szHostName))
{
ipa = *(IPA FAR*)*(phe->h_addr_list);
return ipa;
}
return INADDR_NONE;
}
///////////////////////////////////////////////////////////////////////////////
// Finger -- queries remote finger server for list of users currently //
// logged in. We start by resolving the finger tcp service //
// to a port number, and then we resolve the host specifier to an IP address.//
// Finger then establishes the connection, submits query, and retrieves //
// results. //
///////////////////////////////////////////////////////////////////////////////
bool g_Finger(CString sHost, CString sUser, CString& sFingerOutput)
{
g_AnimateWait->Play(0, -1, -1); // start animation
bool bFingerRet = true; // assume success
SERVENT FAR *pse; // pts to "service" data (internally allocated)
char szHostName[40];
char szUserName[40];
strcpy(szHostName, sHost);
strcpy(szUserName, sUser);
if(pse = getservbyname("finger", NULL)) // looking for finger tcp port
{
UINT FingerPort; // hold the data returned by getservbyname
// because the standard says you *must* copy this
// data out before calling any winsock API function
IPA ipa; // holds internet protocol address
FingerPort = pse->s_port;
if((ipa = g_GetHostAddr((szHostName))) != INADDR_NONE)
{
SOCKET strFingerSocket; // communications end point
if((strFingerSocket = socket(AF_INET, SOCK_STREAM, 0)) >= 0)
{
SOCKADDR_IN strFingerServer;
memset(&strFingerServer, 0, sizeof(strFingerServer)); // address of the finger server
strFingerServer.sin_family = AF_INET;
strFingerServer.sin_port = FingerPort;
strFingerServer.sin_addr.s_addr = ipa;
// establish a stream connection to server
if(!connect(strFingerSocket, (SOCKADDR *)&strFingerServer, sizeof(strFingerServer)))
{
char msg[40 + 3];
int msglen;
strcpy(msg, szUserName);
strcat(msg, "\r\n");
msglen = strlen(msg);
if(send(strFingerSocket, msg, msglen, 0) == msglen)
{
static char buf[500]; // receive buffer
int nchars; // n chars just received, or error
while((nchars = recv(strFingerSocket, (char FAR *)&buf, sizeof(buf), 0)) > 0)
{
*(buf + nchars) = 0;
sFingerOutput += buf;
}
if (nchars < 0)
{
sFingerOutput = "[People] Finger Error (error during receive) - " + sHost; //FE_NORECV
bFingerRet = false;
}
}
else
{
sFingerOutput = "[People] Finger Error (didn't send it (all) - " + sHost; //FE_NOSEND
bFingerRet = false;
}
}
else
{
sFingerOutput = "[People] Finger Error (cannot connect to server) - " + sHost; //FE_NOCONN
closesocket(strFingerSocket);
bFingerRet = false;
}
}
else
{
sFingerOutput = "[People] Finger Error (cannot get socket) - " + sHost; //FE_NOSOCK
bFingerRet = false;
}
}
else
{
sFingerOutput = "[People] Finger Error (don't recognize host name) - " + sHost; //FE_NOHOST
bFingerRet = false;
}
}
else
{
sFingerOutput = "[People] Finger Error (can't find port) - " + sHost; //FE_NOPORT
bFingerRet = false;
}
g_AnimateWait->Play(0, 0, 0);
return (bFingerRet);
}
/////////////////////////////////////////////////////////////////////////////
UINT g_FingerThread(LPVOID pParam)
{
CString sHost = ((CStringArray*)pParam)->GetAt(0);
CString sUser = ((CStringArray*)pParam)->GetAt(1);
((CStringArray*)pParam)->RemoveAll();
delete ((CStringArray*)pParam);
CString sOutput;
g_AnimateWait->Play(0, -1, -1); // start animation
SERVENT FAR *pse; // pts to "service" data (internally allocated)
char szHostName[40];
char szUserName[40];
strcpy(szHostName, sHost);
strcpy(szUserName, sUser);
if(pse = getservbyname("finger", NULL)) // looking for finger tcp port
{
UINT FingerPort; // hold the data returned by getservbyname
// because the standard says you *must* copy this
// data out before calling any winsock API function
IPA ipa; // holds internet protocol address
FingerPort = pse->s_port;
if((ipa = g_GetHostAddr((szHostName))) != INADDR_NONE)
{
SOCKET strFingerSocket; // communications end point
if((strFingerSocket = socket(AF_INET, SOCK_STREAM, 0)) >= 0)
{
SOCKADDR_IN strFingerServer;
memset(&strFingerServer, 0, sizeof(strFingerServer)); // address of the finger server
strFingerServer.sin_family = AF_INET;
strFingerServer.sin_port = FingerPort;
strFingerServer.sin_addr.s_addr = ipa;
// establish a stream connection to server
if(!connect(strFingerSocket, (SOCKADDR *)&strFingerServer, sizeof(strFingerServer)))
{
char msg[40 + 3];
int msglen;
strcpy(msg, szUserName);
strcat(msg, "\r\n");
msglen = strlen(msg);
if(send(strFingerSocket, msg, msglen, 0) == msglen)
{
static char buf[500]; // receive buffer
int nchars; // n chars just received, or error
while((nchars = recv(strFingerSocket, (char FAR *)&buf, sizeof(buf), 0)) > 0)
{
*(buf + nchars) = 0;
sOutput += buf;
}
if (nchars < 0)
sOutput = "[People] Finger Error (error during receive) - " + sHost; //FE_NORECV
}
else
sOutput = "[People] Finger Error (didn't send it (all) - " + sHost; //FE_NOSEND
}
else
{
sOutput = "[People] Finger Error (cannot connect to server) - " + sHost; //FE_NOCONN
closesocket(strFingerSocket);
}
}
else
sOutput = "[People] Finger Error (cannot get socket) - " + sHost; //FE_NOSOCK
}
else
sOutput = "[People] Finger Error (don't recognize host name) - " + sHost; //FE_NOHOST
}
else
sOutput = "[People] Finger Error (can't find port) - " + sHost; //FE_NOPORT
g_AnimateWait->Play(0, 0, 0);
CString sOutputText = g_MakeWindowsTextLines(sOutput);
g_WriteToOutput(TRUE, sOutputText);
return 0;
}
/////////////////////////////////////////////////////////////////////////////
void CPagePeople::OnFinger()
{
UpdateData();
CStringArray* pasFinger = new CStringArray;
pasFinger->Add(m_sServer);
pasFinger->Add(m_sUser);
AfxBeginThread(g_FingerThread, pasFinger);
}
/////////////////////////////////////////////////////////////////////////////
void CPagePeople::OnFingerCurrent()
{
bool bManual = false;
HTREEITEM hParentItem;
HTREEITEM hCurrItem = m_ServerTree.GetSelectedItem();
if(hCurrItem)
{
CString sServer;
CString sUser;
sUser = m_ServerTree.GetItemText(hCurrItem);
if(hParentItem = m_ServerTree.GetParentItem(hCurrItem))
{
sServer = m_ServerTree.GetItemText(hParentItem);
if((m_ServerTree.GetItemState(hParentItem, TVIS_STATEIMAGEMASK) & TVIS_STATEIMAGEMASK) == INDEXTOSTATEIMAGEMASK(ICON_MANUAL))
bManual = true;
}
else
{
sServer = sUser;
sUser = "";
}
if(bManual)
FingerManual(sServer, sUser); // manual finger
else
{
CStringArray* pasFinger = new CStringArray;
pasFinger->Add(sServer);
pasFinger->Add(sUser);
AfxBeginThread(g_FingerThread, pasFinger);
}
}
else
AfxMessageBox("Nothing selected");
}
/////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -