专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 网络通信

recv函数超时,怎么解决

发布时间:2011-07-03 07:14:23 文章来源:www.iduyao.cn 采编人员:星星草
recv函数超时,如何解决?
下面的代码实现发送HTTP请求到服务器,然后接收服务器返回的响应数据。主要代码如下:

SOCKET sock;
string serverHostName=”127.0.0.1”;
UINT serverPort=80;
sring url=”http:// 127.0.0.1/index.htm”;
sockaddr_in serverAddr;
hostent* host;
int retCode;
string str;
char buffer[4096+1];

host=gethostbyname(serverHostName.c_str());
if(host==NULL)
{
cout<<”不能解析主机”<<endl;
return -1;
}

sock=socket(AF_INET, SOCK_STREAM, 0);
serverAddr.sin_addr=*(struct in_addr*)host->h_addr;
serverAddr.sin_family=AF_INET;
serverAddr.sin_port=htons(serverPort);
cout<<”连接到服务器……”<<endl;
cout.flush();

if(connect(sock, (const sockaddr*)&serverAddr, sizeof(sockaddr))=SOCKET_ERROR)
{
cout<<”不能连接到指定主机”<<endl;
cout.flush();
closesocket(sock);
return -1;
}

// HTTP请求头,发送给HTTP服务器
sprintf(buffer, “GET %s HTTP/1.1\r\nHost:%s\r\n\r\n”, url.c_str(), serverHostName.c_str());
cout<<buffer;
cout.flush();
send(sock, buffer, strlen(buffer),0);
while(1)
{
// 接收HTTP服务器的响应数据
retCode=recv(sock, buffer, 4096,0);
if(retCode==0 || retCode==-1)
break;
buffer[retCode]=’\0’;
cout<<buffer;
  cout<<flush();
  str+=buffer;
}

程序运行后,while进行到第4次循环,就出现超时现象,程序失去响应(此时好像数据已经接收完毕)。如何解决recv函数的超时问题呢?


------解决方案--------------------
非阻塞socket
------解决方案--------------------
去查select函数就知道了非阻塞
------解决方案--------------------
方法1:
发送http请求包头时,加上connect: close, 服务器发送完网页后会关闭socket,你这面就能退出循环了。

方法2:
看看http协议,响应报文有个长度值,接受的时候记录一下儿已接受数据的长度,如果等于响应包头的长度值,就不要继续recv了


探讨
下面的代码实现发送HTTP请求到服务器,然后接收服务器返回的响应数据。主要代码如下:

SOCKET sock;
string serverHostName=”127.0.0.1”;
UINT serverPort=80;
sring url=”http:// 127.0.0.1/index.htm”;
sockaddr_in serverAddr;
hostent* host;
……
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: