我看到您提供了一段C++代码,这是一个聊天程序的一部分。根据您的描述,代码在某个地方中止了。我会尝试帮助您找到可能的问题。
首先,我为代码排版以便更容易阅读:BOOL CChatDlg::OnInitDialog() { CDialog::OnInitDialog(); SetIcon(m_hIcon, TRUE); SetIcon(m_hIcon, FALSE); InitSocket(); RECVPARAM *pRevcParam = new RECVPARAM; pRevcParam->socket = m_Socket; pRevcParam->hwnd = m_hWnd; HANDLE hThread = CreateThread(NULL, 0, RecvProc, (LPVOID)pRevcParam, 0, NULL); CloseHandle(hThread); return TRUE;}DWORD WINAPI CChatDlg::RecvProc(LPVOID lpParameter) { SOCKET socket = ((RECVPARAM*)lpParameter)->socket; HWND hwnd = ((RECVPARAM*)lpParameter)->hwnd; SOCKADDR_IN addrFrom; int len = sizeof(SOCKADDR); char recvBuf[200]; char tempBuf[300]; int retVal; while (TRUE) { retVal = recvfrom(socket, recvBuf, 200, 0, (SOCKADDR*)&addrFrom, &len); if (SOCKET_ERROR == retVal) { break; } sprintf(tempBuf, "%s说:%s", inet_ntoa(addrFrom.sin_addr), recvBuf); ::PostMessage(hwnd, WM_RECVDATA, 0, (LPARAM)tempBuf); } return 0;}
代码中有一个可能的问题是在 RecvProc 函数的 recvfrom 调用。如果 recvfrom 返回 SOCKET_ERROR ,这意味着在接收数据时发生了错误。这可能导致代码"运行不下去了",也就是您所描述的问题。但是,在这种情况下,代码应该会跳出循环并正常结束线程。
一个可能的原因是 WSAGetLastError() 返回的错误码。在调试过程中,您可以在 recvfrom 调用失败时检查此错误码:if (SOCKET_ERROR == retVal) { int errCode = WSAGetLastError(); // 这里可以输出或记录错误码,以便进一步分析 break;}
检查 WSAGetLastError() 返回的错误码可以帮助您找到问题的根本原因。这可能是由于初始化Winsock库的问题、套接字创建问题、套接字选项设置问题等。
请注意,我无法看到您的完整代码,包括 InitSocket() 函数和 RECVPARAM 结构的定义。因此,这里的建议可能无法解决您的问题。如果您需要进一步的帮助,请提供更多的上下文或代码,以便我能更好地理解您的问题。 |