1.4.2 具体编码(3)
(8) 定义"查看"按钮的消息处理函数,具体代码如下:
- void CIpmonDlg::OnLookUp()
- {
- char szErr[50], szHostName[MAX_PATH];
- DWORD dwErr;
- SOCKADDR_IN sa;
- gethostname(szHostName, sizeof(szHostName));
- m_iphostsource = m_ipsource;
- m_ipcheckedhost = ntohl(m_iphost);
- if(0 == m_threadID)
- {
- SetDlgItemText(IDC_LOOKUP, "停止查看!");
- }
- else
- {
- if(m_threadID)
- {
- PostThreadMessage(m_threadID, WM_CLOSE, 0, 0);
- SetDlgItemText(IDC_LOOKUP, "开始查看!");
- m_start.EnableWindow(FALSE);
- }
- return;
- }
- DWORD dwBufferLen[10];
- DWORD dwBufferInLen = 1;
- DWORD dwBytesReturned = 0;
- m_s = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
- if(INVALID_SOCKET == m_s)
- {
- dwErr = WSAGetLastError();
- sprintf(szErr, " Error socket() = %ld ", dwErr);
- AfxMessageBox(szErr);
- closesocket(m_s);
- return;
- }
- int rcvtimeo = 5000;
- if(setsockopt(m_s, SOL_SOCKET, SO_RCVTIMEO, (const char *)&rcvtimeo,
- sizeof(rcvtimeo)) == SOCKET_ERROR)
- {
- dwErr = WSAGetLastError();
- sprintf(szErr, "Error WSAIoctl = %ld ", dwErr);
- AfxMessageBox(szErr);
- closesocket(m_s);
- return;
- }
- sa.sin_family = AF_INET;
- sa.sin_port = htons(7000);
- sa.sin_addr.s_addr = m_iphostsource;
- if (bind(m_s, (PSOCKADDR)&sa, sizeof(sa)) == SOCKET_ERROR)
- {
- dwErr = WSAGetLastError();
- sprintf(szErr, "Error bind() = %ld ", dwErr);
- AfxMessageBox(szErr);
- closesocket(m_s);
- return;
- }
- if(SOCKET_ERROR != WSAIoctl(m_s, SIO_RCVALL, &dwBufferInLen,
- sizeof(dwBufferInLen),
- &dwBufferLen,
- sizeof(dwBufferLen),
- &dwBytesReturned, NULL, NULL))
- AfxBeginThread(threadFunc, (LPVOID)this);
- else
- {
- dwErr = WSAGetLastError();
- sprintf(szErr, "Error WSAIoctl = %ld ", dwErr);
- AfxMessageBox(szErr);
- closesocket(m_s);
- return;
- }
- }