WinSocket的问题:非阻塞模式recv返回-1,WSAGetLastError 返回 0

重新注册 2017-01-12 11:27:41
尝试非阻塞的socket编程,碰到WSAGetLastError()一直是返回值为0的问题,百度了几个博客,都说是因为WSAGetLastError()的调用必须及时,不能被其他的系统调用隔开,否则得到的错误值被掩盖。
如博客: http://blog.csdn.net/tianbaowen/article/details/8485567
然而,我的代码在recv()后紧跟着的系统调用就是WSAGetLastError(),却依然得到的是返回值0。最后上了国外的网站看,有人说是需要直接调用GetLastError()就可以,结果一改,果然就得到了10035,现在还不知道为何。。。


DWORD IniSOCKDLL()
{
WORD wVersionRequested;
WSADATA wsaData;
int err=0;

wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if(err != 0)
return err;
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) {
WSACleanup( );
err = -1;
}
return err;
}

int main()
{
int status;
IniSOCKDLL();
SOCKET sc=socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_IN addr;
int len;
addr.sin_family=AF_INET;
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
addr.sin_port = htons(21050);
len = sizeof(addr);
cout << "start client" << endl;
status = ::connect(sc, (struct sockaddr *)&addr, len);//server已开启,连接server端

char buff[1024];
ZeroMemory(buff,1024);
memcpy(buff,"linking",7);


u_long iMode = 1;//非阻塞模式
ioctlsocket(sc, FIONBIO, &iMode);//设置套接字sc为非阻塞模式
len = send(sc,buff, strlen(buff),0);
while(!quit){
len = recv(sc, buff, 1024, 0);
if(len < 0){
int err = GetLastError();//改成这个就好使; 用WSAGetLastError()就一直是0
if(err == WSAENETDOWN || err == WSAECONNRESET || err == WSAENOTCONN){//断线重连
closesocket(sc);
sc = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, NULL);
int status = ::connect(sc, (struct sockaddr *)&addr, sizeof(addr));
if(status < 0){
Sleep(3000);
}else{
memcpy(buff,"linking",7);
ioctlsocket(sc, FIONBIO, &iMode);
send(sc,buff,7,0);
}
}else if(err == WSAEWOULDBLOCK){
Sleep(10);
}
continue;
}
send(sc, "received", strlen("received"), 0);
if(strncmp(buff,"left",4) ==0){
cout << "left" << endl;
}else if(strncmp(buff,"right",5)==0){
cout << "right" << endl;
}
ZeroMemory(buff, 1024);

}//while

closesocket(sc);
cout << "stopped..." << endl;
return 0;
}
...全文
555 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-01-13
  • 打赏
  • 举报
回复
Windows的bug,试试安装最新的SP。我猜。
赵4老师 2017-01-13
  • 打赏
  • 举报
回复
10035 无法立即完成一个非阻止性套接字操作。

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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