1.4.2 具体编码(4)
(9) 定义"确定"按钮的响应函数OnOK(),具体代码如下:
- void CIpmonDlg::OnOK()
- {
- if(NULL != m_threadID)
- PostThreadMessage(m_threadID, WM_CLOSE, 0, 0);
- if(m_IPArr.GetSize())
- m_IPArr.RemoveAll();
- CDialog::OnOK();
- }
(10) 定义函数threadFunc(LPVOID p),此函数是本项目的核心,用于监听网络线程。具体实现代码如下: - UINT threadFunc(LPVOID p)
- {
- CIpmonDlg *pDlg = static_cast<CIpmonDlg*>(p);
- char buf[1000], *bufwork;
- MSG msg;
- int iRet;
- DWORD dwErr;
- char *pSource, *pDest;
- IPHEADER *pIpHeader;
- in_addr ina;
- char szSource[16], szDest[16], szErr[50];
- char *pLastBuf = NULL;
-
- int HdrLen, totallen;
- WORD sourport, destport;
-
- struct TCPPacketHead *pTCPHead;
- struct ICMPPacketHead *pICMPHead;
- struct UDPPacketHead *pUDPHead;
- BYTE *pdata = NULL;
-
- PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);
- //queue
- pDlg->m_threadID = GetCurrentThreadId();
-
- while(TRUE)
- {
- if(PeekMessage(&msg, 0, WM_CLOSE, WM_CLOSE, PM_NOREMOVE))
- {
- closesocket(pDlg->m_s);
- pDlg->m_threadID = 0;
- pDlg->m_start.EnableWindow(TRUE);
- break;
- }
- memset(buf, 0, sizeof(buf));
- iRet = recv(pDlg->m_s, buf, sizeof(buf), 0);
- if(iRet == SOCKET_ERROR)
- {
- dwErr = WSAGetLastError();
- sprintf(szErr, "Error recv() = %ld ", dwErr);
- continue;
- }
- else
- if(*buf)
- {
- bufbufwork = buf;
- pIpHeader = (IPHEADER*)bufwork;
- WORD iLen = ntohs(pIpHeader->total_len);
- while(TRUE)
- {
- if(iLen <= iRet)
- {
- ina.S_un.S_addr = pIpHeader->sourceIP;
- pSource = inet_ntoa(ina);
- strcpy(szSource, pSource);
- ina.S_un.S_addr = pIpHeader->destIP;
- pDest = inet_ntoa(ina);
- strcpy(szDest, pDest);
- CString str, strProto, strSourPort,
- strDestPort, strData, strSize;
- strProto = get_proto_name(pIpHeader->proto);
- HdrLen = pIpHeader->header_len&0xf;