linux下socket tcp客户端读取数据

ningto.com 2011-11-16 01:13:46
这是《UNIX网络编程》里的一段代码,用来读取数据,
我用的时候因为不知道将要接受的数据的大小,所以通常定义一个比较大的数组,如:
char buffer[1024] = {0};
SocketClass.readn(buffer, 1024);
但是有个问题,当read(m_socket, ptr, nleft)数据已经获取完了,下次再读的时候由于服务器那边没有数据过来就会阻塞,怎么解决啊.
不知道说清楚没有,
如:
服务器发送过来的数据只有100个字节,那么当我read完这个100个字节后,while循环还没有退出会继续read,
这时候read当然就没有数据了,但是会阻塞,不知道怎么解决好呢?

int readn(void *vptr, int n)
{
int nleft;
int nread;
char *ptr;

ptr = vptr;
nleft = n;
while (nleft > 0)
{
if ((nread = read(m_socket, ptr, nleft)) < 0)
{
if (errno == EINTR)
{
nread = 0;
}
else
{
return (-1);
}
}
else if (nread == 0)
{
break;
}
nleft -= nread;
ptr += nread;
}

return (n-nleft);
}
...全文
342 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
上山老人 2011-11-16
  • 打赏
  • 举报
回复
readn里面不是有循环么?你外面还写循环了吗? 里面的这个循环读完参数n个字节不久退出来了么?
ma100 2011-11-16
  • 打赏
  • 举报
回复
把读函数放到一个新的线程里面去

用阻塞比较好,我个人认为, 非阻塞容易丢东西, 浪费cpu
JoeBlackzqq 2011-11-16
  • 打赏
  • 举报
回复
因为你是阻塞方式呀,所以到了read就会阻塞的。可以改成非阻塞方式,这样就不会阻塞了。
justkk 2011-11-16
  • 打赏
  • 举报
回复
约定一个简单的协议,比如先传输一个报文长度,后面再传输具体的报文内容

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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