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

游牧小小诗人 2011-06-13 07:47:32

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


...全文
342 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
西湖秀才 2011-06-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 dxy0613 的回复:]

引用 3 楼 lijianli9 的回复:

你创建的socket是阻塞性的socket吗?
MSDN如是说
WSAEWOULDBLOCK The socket is marked as nonblocking and the recvfrom operation would block.


socket (AF_INET, SOCK_STREAM, 0)
阻塞的~~~~~~~……
[/Quote]
SOCK_STREAM是TCP的,对应recv(),SOCK_DGRAM才对应recvfrom()
游牧小小诗人 2011-06-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 visualeleven 的回复:]

你写的是非阻塞模式??
[/Quote]

阻塞的~~~照着最简单的书抄的~~~~然后在你空间也看了一篇,,基本上写法都一样哇。为啥我的要报错哇~~~
游牧小小诗人 2011-06-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lijianli9 的回复:]

你创建的socket是阻塞性的socket吗?
MSDN如是说
WSAEWOULDBLOCK The socket is marked as nonblocking and the recvfrom operation would block.
[/Quote]

socket (AF_INET, SOCK_STREAM, 0)
阻塞的~~~~~~~~~~~~
游牧小小诗人 2011-06-15
  • 打赏
  • 举报
回复

int main()
{
fstream file("D:\\errorlog.txt");
WSADATA wsaData;
int error(0);

error = WSAStartup(MAKEWORD(2, 2), &wsaData);

if (0 != error)
{
file << "网络初始化失败"
<< std::endl;
file.close();
return FALSE;
}

SOCKET serviceSock;
serviceSock = socket(AF_INET, SOCK_STREAM, 0);

if (SOCKET_ERROR == serviceSock)
{
file << "套接字初始化失败"
<< std::endl;
file.close();
return FALSE;
}

SOCKADDR_IN serviceAddr;
memset(&serviceAddr, 0, sizeof(serviceAddr));
serviceAddr.sin_family = AF_INET;
serviceAddr.sin_port = htons(5500);
serviceAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

if ( SOCKET_ERROR == bind(serviceSock, (SOCKADDR*)&serviceAddr, sizeof(SOCKADDR)) )
{
file << "套接字绑定失败"
<< std::endl;
file.close();
return FALSE;
}

int len = sizeof(SOCKADDR);
SOCKADDR_IN clientAddr;
memset(&clientAddr, 0, sizeof(clientAddr));

char recvbuf[200];
char tempbuf[300];

while(TRUE)
{
if (SOCKET_ERROR == recvfrom(serviceSock, recvbuf, 200, 0, (SOCKADDR*)&clientAddr, &len))
{
file << "数据接收失败"
<< std::endl;
file << "错误码:"
<< GetLastError()
<< std::endl;
file.close();
return FALSE;
}

printf("%s 说: %s", inet_ntoa(clientAddr.sin_addr), recvbuf);

}
file.close();
closesocket(serviceSock);

system("pause");
return 0;
}


重新写了一下,这次没建立MFC工程,,直接一个cpp编译的,,,
然后日志文件内容:
数据接收失败
错误码:10057

10057 MSDN 显示为,未连接的socket~~~~~~~~~

UDP 需要连接吗????奇怪了,怎么产生这个错误~~~~~

求解。。。太新手了~~~~新到无语了~~~

Eleven 2011-06-15
  • 打赏
  • 举报
回复
你写的是非阻塞模式??
lijianli9 2011-06-15
  • 打赏
  • 举报
回复
你创建的socket是阻塞性的socket吗?
MSDN如是说
WSAEWOULDBLOCK The socket is marked as nonblocking and the recvfrom operation would block.
游牧小小诗人 2011-06-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wocow3 的回复:]

AfxMessageBox(_T("数据接收错误"));
这句话去掉。。
[/Quote]

去掉这句没啥用,,主要的是最后还是运行到break去了,,最后线程退出了~~~~~~~
游牧小小诗人 2011-06-15
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 hurryboylqs 的回复:]

果真是抄,而且还抄错,TCP用recv不是recvfrom
所以你应该将serviceSock = socket(AF_INET, SOCK_STREAM, 0);改为
serviceSock = socket(AF_INET, SOCK_DGRAM , 0);
[/Quote]

非常感谢。。。确实是这个问题,我排错的时候,根本就没去想过这个问题点,谢谢楼上两位,又学到一点知识~~~结贴~~
hurryboylqs 2011-06-15
  • 打赏
  • 举报
回复
果真是抄,而且还抄错,TCP用recv不是recvfrom
所以你应该将serviceSock = socket(AF_INET, SOCK_STREAM, 0);改为
serviceSock = socket(AF_INET, SOCK_DGRAM , 0);

wocow3 2011-06-14
  • 打赏
  • 举报
回复
AfxMessageBox(_T("数据接收错误"));
这句话去掉。。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧