当前位置: 技术问答>linux和unix
关于linux下基于http协议规范socket编程中的recv方法
来源: 互联网 发布时间:2015-09-23
本文导语: 在使用http协议下载文件时,我在一个循环里接收数据,recv方法返回为-1,0时跳出循环,结束接收数据。目前遇到了一个奇怪的问题,在接收完数据后再recv时,有的服务器收到的是0,自然就跳出来了,而有的却没有...
在使用http协议下载文件时,我在一个循环里接收数据,recv方法返回为-1,0时跳出循环,结束接收数据。目前遇到了一个奇怪的问题,在接收完数据后再recv时,有的服务器收到的是0,自然就跳出来了,而有的却没有任何响应,程序停在那了(recv上了)。
该怎么解决?
谢谢先
该怎么解决?
谢谢先
|
struct timeval timeout; //超时时间
timeout.tv_sec = 10;
timeout.tv_usec = 0;
switch(select(sockfd + 1,&fdR,NULL,NULL,&timeout))
{
case -1:
//error;
continue;
break;
case 0:
//timeout
continue;
break;
default:
recv();
break;
}
timeout.tv_sec = 10;
timeout.tv_usec = 0;
switch(select(sockfd + 1,&fdR,NULL,NULL,&timeout))
{
case -1:
//error;
continue;
break;
case 0:
//timeout
continue;
break;
default:
recv();
break;
}
|
设置超时机制。
欢迎访问我的个人网站www.linuxc.net
欢迎访问我的个人网站www.linuxc.net
|
引入超时函数,代码如下
* Waits for a file descriptor to change status or unblocked signal
* @param fd file descriptor
* @param timeout seconds to wait before timing out or 0 for no timeout
* @return 1 if descriptor changed status or 0 if timed out or -1 on error
*/
int
waitfor(int fd, int timeout)
{
fd_set rfds;
struct timeval tv = { timeout, 0 };
FD_ZERO(&rfds);
FD_SET(fd, &rfds);
return select(fd + 1, &rfds, NULL, NULL, (timeout > 0) ? &tv : NULL);
}
* Waits for a file descriptor to change status or unblocked signal
* @param fd file descriptor
* @param timeout seconds to wait before timing out or 0 for no timeout
* @return 1 if descriptor changed status or 0 if timed out or -1 on error
*/
int
waitfor(int fd, int timeout)
{
fd_set rfds;
struct timeval tv = { timeout, 0 };
FD_ZERO(&rfds);
FD_SET(fd, &rfds);
return select(fd + 1, &rfds, NULL, NULL, (timeout > 0) ? &tv : NULL);
}
|
如果是正常建断连接 应该没问题
如果是异常 就需要建立超时机制
http://community.csdn.net/Expert/topic/3945/3945333.xml?temp=.1687281
如果是异常 就需要建立超时机制
http://community.csdn.net/Expert/topic/3945/3945333.xml?temp=.1687281