read在读取socket的时候为何一直堵塞,如何处理让read读取完数据立即返回。

small_hammer 2016-06-05 06:34:16

int MyTcpRcv(int sockfd, char *buffer, int length)
{
int len=0;
int totalcnt;
totalcnt = 0;
while(totalcnt < length) {
len = read(sockfd, buffer + totalcnt, length - totalcnt);
if (len < 0) {
if ((errno == EINTR)||(errno == [EAGAIN)) {
len = 0;
break;
}
else
{
return(-1);
}
}
else if (len == 0)
{
break;
}
totalcnt = totalcnt + len;
}
return(totalcnt);
}

自己实现了一个recv函数,在服务端接收客户端数据的时候发现 read第一次就应该读取完发送过来的数据了,但是read却会一直阻塞在哪里,请问这个问题需要如何解决,需要对socket做啥处理吗?
另外我这里设置了一个 接收超时时间
rwto.tv_sec = 2;
rwto.tv_usec= 0;
rc = setsockopt(ilSockfd,SOL_SOCKET,SO_RCVTIMEO,&rwto,sizeof(rwto));
这样在2s以后read就会收到一个EAGAIN 然后返回。如何处理让read完就直接返回?而不是堵塞哪里直到这个接收时间超时。
...全文
880 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
mLee79 2016-06-06
  • 打赏
  • 举报
回复
设置成 nonblocking 模式啊, win 下就 unsigned long mode = 1; ioctlsocket(sock, FIONBIO, &mode); Linux 下: int flags = fcntl(sock, F_GETFL, 0); flags |= flags|O_NONBLOCK; fcntl(sock, F_SETFL, flags);
mLee79 2016-06-06
  • 打赏
  • 举报
回复
对啊, 你不是要立刻返回么, 返回 -1 , errno == EAGAIN, EWOULDBLOCK 就是让你等段时间再读啊... 然后你可以 select/poll/epoll 等到有数据到达再去读啊 ...
small_hammer 2016-06-06
  • 打赏
  • 举报
回复
设置成非阻塞模式,read不到任何东西就会直接返回。 int flags = fcntl(sock, F_GETFL, 0); flags |= flags|O_NONBLOCK; fcntl(sock, F_SETFL, flags); 我有尝试,没有解决问题。

69,374

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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