进行网络开发会出现堵塞的情况,一般来说,会有三种解决办法:
- 在头部约定好数据的长度。当读取到的长度等于这个长度时就不再继续调用recv方法
- 约定结束标志,当读到该结束标志时退出不再recv
- 设置超时,会在设置的超时时间到达后退出而不再阻塞
第一种方法简单实用,但是如果返回头信息中是transfer-encoding:chunked,即分块传输的情况无法使用;
第二种方法碰到比较复杂的返回不好处理;
第三种可以,但是对网络的要求比较高。
对于分块传输的情况则不能通过Content-Length:xx来获取报文长度,我是通过设置超时来解决的,代码如下:
while(1)
{
FD_ZERO(&rfds);//清空描述符集合
FD_SET(0, &rfds);//将标准输入(stdin)添加到集合中
FD_SET(socket_fd, &rfds);//将我们的套接字描述符添加到集合中
/*设置超时时间*/
timeout.tv_sec = 1;