Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么上次读取()需要很长时间才能返回_C_Network Programming - Fatal编程技术网

C 为什么上次读取()需要很长时间才能返回

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 =

我编写了一个简单的程序,使用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 = 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协议的服务器?