首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络技术 > 网络协议 >

在非阻塞模式上怎么知道recv接收数据完成

2012-08-15 
在非阻塞模式下如何知道recv接收数据完成将socket设为非阻塞模式,然后用select进行I/O复用,如果有数据可读

在非阻塞模式下如何知道recv接收数据完成
将socket设为非阻塞模式,然后用select进行I/O复用,如果有数据可读,那么就调用recv进行读取,但是因为是非阻塞的,所以我们要用循环进行不断读取,那么如何知道数据读取完成了呢? 我认为当recv返回的字节数小于0,errno==EAGAIN的时候数据读取完成,不知道对不对??


if(FD_ISSET(sock_fd, &fds_red))
{
  //receive data
  do
  {
  retlen = recv(sock_fd, ptr, leftlen, 0) ;
if(retlen < 0)
{
if(errno == EAGAIN)
break;
else if(errno == EINTR || errno == EWOULDBLOCK)
retlen = 0;
else
syslog(LOG_ERR, "%s:%d, recv data error is %d", __FILE__, __LINE__, errno);
}
recvlen += retlen;
leftlen -= retlen;
ptr += retlen;
  }
  while(recvlen && leftlen);
}

[解决办法]
数据读取完成是什么意思?

如果是UDP,那么发送端是分包(<64k)发送的,读取时,要么成功
读取一个数据包,要么失败。

如果是TCP,需要根据自己的数据协议读取所需要的数据。
[解决办法]
对于UDP来说,发送是一个消息块,接收读取的也是一个消息块,
这是由UDP协议决定的,和socket没什么关系。

对于TCP,可以看做是数据流,需要读取多少数据,取决于应用
程序的私有协议。
[解决办法]
recv 返回 EWOULDBLOCK 即表示缓冲无数据。
对udp不一定,缓冲内可能有几个包,recvfrom一次只取一个。
[解决办法]
select返回0好像也是读完了,在timeout的情况下。
[解决办法]
你的程序要有判断是否读完的标识,比如100个字节读完了就认为读完了,或者遇到某个字符标识认为读完了

热点排行