socket的阻塞

nizainade 2007-09-28 10:25:46
我在写一个服务端和客户端通过socket的udp通信的程序.实现和网上的例子差不多,服务端是先bind某个端口,然后用recvfrom阻塞等待接收客户端的数据,接收到数据后再用sendto向客户端发送应答数据;客户端启动后就用sendto向服务端发送数据,然后用recvfrom等待服务端的应答.

现在的问题是,当服务端先启动时,通信正常;客户端先启动的时候,到了recvfrom的时候就直接返回-1的错误而并没有阻塞等待服务端的应答,这是为什么?

另一个相同的帖子:http://community.csdn.net/Expert/topic/5776/5776223.xml?temp=.9725305
...全文
325 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
vocanicy 2007-09-28
  • 打赏
  • 举报
回复
应该是超时了

返回SOCKET_ERROR之后可以通过WSAGetLastError得知失败的原因
nizainade 2007-09-28
  • 打赏
  • 举报
回复
大致的代码流程就是这样:
WSADATA wsaData;
if(0!= WSAStartup(MAKEWORD(2,1),&wsaData))
{
cout<<"WSAStartup failed! fail code:"<<WSAGetLastError()<<endl;
return;
}
......
if(INADDR_NONE==(lAddr=inet_addr(strDest)))
{
cout<<"invalid ip address!"<<endl;
return;
}
else
{
addrDest.sin_family=AF_INET;
addrDest.sin_addr.s_addr=lAddr;
addrDest.sin_port=htons(iPort);
memset(addrDest.sin_zero,0,sizeof(addrDest.sin_zero));
}
sockSend=socket(AF_INET,SOCK_DGRAM,0);
while(1)
{
cout<<"send to server:";
cin>>pSendData;
int iSendBytes;
if(SOCKET_ERROR==(iSendBytes=sendto(sockSend,pSendData,iSendLen,0,(sockaddr*)&addrDest,sizeof(sockaddr))))
{
cout<<"sendto error! code:"<<GetLastError()<<endl;
return;
}
iRecvBytes=recvfrom(sockSend,pRecvBuff,iRecvBuffLen,0,(sockaddr*)&addrDest,&iAddrLen);//就是这里总是返回-1
if(SOCKET_ERROR==iRecvBytes)
{
cout<<"recvfrom error! code:"<<WSAGetLastError();
return;
}
else
cout<<"receive data:"<<pRecvBuff<<endl;
Sleep(1000);
}

请哪位帮忙看看是怎么回事,感激不尽!
nizainade 2007-09-28
  • 打赏
  • 举报
回复
WSAGetLastError返回的是10054,也就是WSAECONNRESET,好像不是超时,看msdn了,好像意思是说前面在发送的时候端口不可达,那么是因为服务端没启动,没有在特定的端口监听数据,导致前面的sendto没有发送数据到指定的端口? 如果这样的话,我感觉应该在sendto函数就应该报错,但是sendto又能发送成功了?

18,356

社区成员

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

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