sock recvfrom返回-1 WSAGetLastError() 返回0 求解

游牧小小诗人 游牧小小诗人 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

//======================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的都不谈~~~~阻塞模式~
//谢谢各位啦~~~~~~~~~~~~~~~


...全文
评论 10
收藏 已收藏
分享
返回顶部
游牧小小诗人
网络编程 18,356 成员 64,161 内容