sock recvfrom返回-1 WSAGetLastError() 返回0 求解
//======================MySock.h====================================
struct PostThreadMsg
{
SOCKET s;
HWND hwnd;
};
class CMySock
{
//邪恶的省略号................
private:
//构造函数中:PostMsg = new PostThreadMsg;
//析构中delete PostMsg;
PostThreadMsg *PostMsg;
SOCKET m_ServiceSock;
}
//======================MySock.cpp====================================
BOOL CMySock::StartNewThread(HWND hwnd)
{
PostMsg->s = m_ServiceSock;//m_ServiceSock 见.h中,且初始、绑定都正确完成
PostMsg->hwnd = hwnd;
HANDLE hRecvMsgHandle = CreateThread(NULL, 0, &RecvMsgProc, (LPVOID)PostMsg, 0, NULL);
//邪恶的省略号................
CloseHandle(hRecvMsgHandle);
}
//消息接收线程处理函数 静态成员函数
DWORD WINAPI CMySock::RecvMsgProc(LPVOID lpParameter)
{
SOCKET s = ((PostThreadMsg*)lpParameter)->s;
HWND hwnd = ((PostThreadMsg*)lpParameter)->hwnd;
int error(0);
int len = sizeof(SOCKADDR);
SOCKADDR_IN CAddr;
char recvbuf[200];
char tempbuf[300];
while(TRUE)
{
error = recvfrom(s, recvbuf, 200, 0, (SOCKADDR*)&CAddr, &len);
if (SOCKET_ERROR == error)
{
AfxMessageBox(_T("数据接收错误"));
CString err("");
err.Format(_T("错误码:%d"), WSAGetLastError());
AfxMessageBox(err);
//不要纠结这句的顺序
if (WSAEWOULDBLOCK != WSAGetLastError())
{
break;
}
}
sprintf(tempbuf, "%s 说: %s",inet_ntoa(CAddr.sin_addr), recvbuf);
//测试也能正常同主线程对话
::PostMessage(hwnd, WM_RECVMSG, 0, (LPARAM)tempbuf);
}
closesocket(s);
AfxMessageBox(_T("接收线程退出"));
return 0;
}
//编译无错,DeBug Release都编译通过,初学,什么IOCP的都不谈~~~~阻塞模式~
//谢谢各位啦~~~~~~~~~~~~~~~
...全文


网络编程
