recv非阻塞情况下接收数据的问题

zeeaa 2010-07-07 10:01:59
我刚接触网络编程,向各位高手请教几个问题
1.就是在非阻塞情况下,recv调用返回SOCKET_ERROR并且WSAGetLastError()==WSAEWOULDBLOCK时,下面的代码recvbuf是接收到数据还是没有接收到数据?是不是recv接收了一些数据,这时需要阻塞,然后发出WSAEWOULDBLOCK错误,等待可以接收数据时接着接收剩下的数据?还是发出WSAEWOULDBLOCK错误时recv调用就已经失败了,recvbuf里根本没有接收的数据,然后期待下次可以接收数据时再正常接收?
2.有没有在接收的过程中出现WSAEWOULDBLOCK的情况?会中断传输吗?
3. send是不是和recv在非阻塞情况下一样?

do {

iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
if ( iResult > 0 )
printf("Bytes received: %d\n", iResult);
else if ( iResult == 0 )
printf("Connection closed\n");
else
printf("recv failed: %d\n", WSAGetLastError());

} while( iResult > 0 );

谢谢大家帮忙解答
...全文
595 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zeeaa 2010-07-08
  • 打赏
  • 举报
回复
Syntax

typedef struct timeval {
long tv_sec;
long tv_usec;
} timeval;

Members
tv_sec
Time value, in seconds.

tv_usec
Time value, in microseconds.

MSDN上查的,确实是微秒,谢谢提醒:-)
hastings 2010-07-08
  • 打赏
  • 举报
回复
一楼,弱弱的问一下:
timeval TimeOut;
TimeOut.tv_sec=0;
TimeOut.tv_usec=2000; //这个应该是指2000微妙吧,也就是2毫秒,也就是0.002秒?

zeeaa 2010-07-07
  • 打赏
  • 举报
回复
再问一下非阻塞的send需要select模型吗?
zeeaa 2010-07-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lijianli9 的回复:]
应该不可以,因为select也有可能返回失败情况,你如果一直要等到接收成功数据的话,还是放到while循环中把,
[/Quote]
好的,谢谢!
lijianli9 2010-07-07
  • 打赏
  • 举报
回复
应该不可以,因为select也有可能返回失败情况,你如果一直要等到接收成功数据的话,还是放到while循环中把,
zeeaa 2010-07-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 tttyd 的回复:]
对,但是必须使用Select模型
[/Quote]
恩,谢谢,select模型中的
FD_ZERO(&fdRead);
FD_SET(ConnectSocket,&fdRead);
int ret=::select(0,&fdRead,NULL,NULL,&TimeOut);
可以写在循环外面吗
雪影 2010-07-07
  • 打赏
  • 举报
回复
对,但是必须使用Select模型
zeeaa 2010-07-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 tttyd 的回复:]
使用select模型,不然cpu消耗太大。

非阻塞模型时WSAEWOULDBLOCK按正确返回处理就是
[/Quote]
也就是说,当WSAEWOULDBLOCK发生时,recv并没有接收到有效数据?一直等到recv返回的值大于或等于0,时才说明recv接收到数据。其它情况不处理recvbuf缓冲区?
雪影 2010-07-07
  • 打赏
  • 举报
回复
使用select模型,不然cpu消耗太大。

非阻塞模型时WSAEWOULDBLOCK按正确返回处理就是
雪影 2010-07-07
  • 打赏
  • 举报
回复
do { 
fd_set fdRead;
timeval TimeOut;
TimeOut.tv_sec=0;
TimeOut.tv_usec=2000; //2S

FD_ZERO(&fdRead);
FD_SET(ConnectSocket,&fdRead);
int ret=::select(0,&fdRead,NULL,NULL,&TimeOut);
iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
if ( iResult > 0 )
printf("Bytes received: %d\n", iResult);
else if ( iResult == 0 )
printf("Connection closed\n");
else
printf("recv failed: %d\n", WSAGetLastError());
} while( iResult > 0 );

18,356

社区成员

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

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