Recv接收问题

zhengshouquan 2013-07-02 05:46:23
在接收服务器发回来的数据过程中,如果中途断开网络,再重新接恢复网络之后.重新创建套接字,重建连接,再接收数据时,会一直接收不成功!跟踪WSAGetLastError,发现是10035,按理不是错误。是没有数据发送。但实际上是有发送数据的啊。不知道什么原因造成的。

n = Recv(fd, recvbuf, 4, 0);
DWORD dwError = WSAGetLastError();
...全文
179 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
没有看到明显的错误,有可能真的是没有数据过来,你用嗅探器抓个包看看,有没有数据过来。怀疑你的发送端有问题。
zhengshouquan 2013-07-02
  • 打赏
  • 举报
回复
Recv函数如下:调用的是非阻塞模式,跟踪调试发现,select(0, &r, 0, 0, &timeout)的结果一直是0,一直表示超时,把时间改成10s一样为0. 何解? typedef int ssize_t; ssize_t Recv(int fd, void *recvbuf, size_t len, int flags) { ssize_t n = 0, num = len; int times = 0; char *tmpbuf = (char *)recvbuf; int nTimeOut = 1000; setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, (CHAR *)&nTimeOut, sizeof(int));//设置阻塞时间 RecvAgain: int i = 0; for(i = 0; i < 5; i++) { int iRet; struct timeval timeout ; fd_set r; FD_ZERO(&r); FD_SET(fd, &r); timeout.tv_sec = 2; //连接超时2秒 timeout.tv_usec =0; iRet = select(0, &r, 0, 0, &timeout); DWORD dwError = WSAGetLastError(); if ( iRet <= 0 ) { continue; } else { if(TRUE == FD_ISSET(fd, &r)) { break; } } } n = recv(fd, &tmpbuf[len - num], num, flags); if (!n) { return 0; } if (n < 0) { if (times++ < 8)//8 goto RecvAgain; else return 0; } num = num - n; if (num != 0) goto RecvAgain; else return(len); }
lyingbo 2013-07-02
  • 打赏
  • 举报
回复
关于10035的解释,楼主参考下这里http://bbs.csdn.net/topics/120094432
  • 打赏
  • 举报
回复
1楼说的对,你可以把代码发上来看看
ShengFei01 2013-07-02
  • 打赏
  • 举报
回复
如果你连接成功了,对方也发数据了,recv应该能收到数据,还收不到的话,只能查写的是否有问题,这有socket例子,不妨参考下: http://download.csdn.net/detail/geoff08zhang/4571358

18,356

社区成员

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

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