C 为什么上次读取()需要很长时间才能返回
我编写了一个简单的程序,使用unix套接字从服务器下载html文件 我使用write()发送“Get/index.html Host:*”消息,然后使用while循环读取() 答复。一切都很顺利,但返回0的最后一次read()需要很长时间才能返回。有没有办法更正代码,这样我就不需要等待这个特殊的时间?或者这是怎么发生的C 为什么上次读取()需要很长时间才能返回,c,network-programming,C,Network Programming,我编写了一个简单的程序,使用unix套接字从服务器下载html文件 我使用write()发送“Get/index.html Host:*”消息,然后使用while循环读取() 答复。一切都很顺利,但返回0的最后一次read()需要很长时间才能返回。有没有办法更正代码,这样我就不需要等待这个特殊的时间?或者这是怎么发生的 sprintf(cmdstr,"%s %s %s\r\nHOST:%s\r\n\r\n",METHOD,place,VERSION,host); cmdlen =
sprintf(cmdstr,"%s %s %s\r\nHOST:%s\r\n\r\n",METHOD,place,VERSION,host);
cmdlen = strlen(cmdstr);
if (write(sockfd,cmdstr,cmdlen) != cmdlen) {
perror("write cmd error");
return ;
}
while ((n = read(sockfd,read_data,BUFSIZE)) > 0) {
read_data[n] = 0;
p = read_data;
if (filep == NULL) {
if (filep = fopen(filename,"w")) == NULL) {
perror("fopen ");
return;
}
p = strstr(read_data,"\r\n\r\n");
p += 4;
}
fputs(p,filep);
}
printf ("%s download completed.\n",filename);
因为您要求套接字在没有更多数据可读取时读取
BUFSIZE
数据。我假设对read
的调用会阻止等待更多数据通过TCP连接到达,并且只会在连接关闭一段时间后返回
如果您知道文件有多大,那么您可以请求只读取该数量的数据。如果您不知道文件有多大,则在传输文件时,您依赖服务器关闭连接。如果没有数据准备就绪,
recv
将阻塞或失败(取决于它是阻塞还是非阻塞)。当套接字的另一端关闭连接时,
recv
返回零。从来没有别的
这通常不会发生在HTTP/1.1(现在几乎所有现有服务器)上,至少不会立即发生,因为默认情况下连接将保持活动状态
发送一个连接:close
向服务器发出不希望出现这种行为的信号。然后它应该尽快断开连接(当然,在发送完所有信息后)
或者,您可以尝试调用shutdown(sockfd,shutu-WR)代码>,它执行连接的半关闭,服务器可能(希望)对此做出适当的反应
或者,最后,您只能读取内容长度告诉您的数据量,然后断开连接,但这对服务器来说是一种反社会行为,而且并非完全没有风险。内容长度标题将告诉您要读取多少数据,所以此“时间”必须存在?我是否可以测试任何标志以知道服务器已经传输了所有数据,以便我可以手动退出我的程序或任何其他方法来避免这种情况?那你就要听命于服务器了。除非,@AndyIrving提到,Content-length
标题存在,您可以对其进行解析。“Content-length”就是这样!thk Nick,thk Andy我知道该怎么做:)如果你尝试使用telnet,连接是否仍然需要时间才能关闭?哦,你是连接到一个合适的web服务器还是另一个使用类似HTTP协议的服务器?