Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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
检查EOF时套接字/文件流上的C fgetc()进入无限循环_C_Loops_Eof_Infinite_Fgetc - Fatal编程技术网

检查EOF时套接字/文件流上的C fgetc()进入无限循环

检查EOF时套接字/文件流上的C fgetc()进入无限循环,c,loops,eof,infinite,fgetc,C,Loops,Eof,Infinite,Fgetc,while循环永远不会结束。为什么会这样?我用一个本地文件完成了这项工作,效果很好。它在for循环中也可以正常工作,只是fgetc()永远不会返回EOF。HTTP/1.1默认为connection:keepalive,所以正如simonc所说,服务器实际上是在等待您发出下一个请求,并将等待服务器相关的超时。 使用HTTP/1.0获取EOF FWIW:完成该请求需要245秒。http\U请求中有一个输入错误-应该以“\r\n\r\n”结尾。http服务器是否可能因为您的请求不完整而不发送任何响应?

while循环永远不会结束。为什么会这样?我用一个本地文件完成了这项工作,效果很好。它在for循环中也可以正常工作,只是fgetc()永远不会返回EOF。

HTTP/1.1
默认为
connection:keepalive
,所以正如simonc所说,服务器实际上是在等待您发出下一个请求,并将等待服务器相关的超时。 使用
HTTP/1.0
获取
EOF


FWIW:完成该请求需要245秒。

http\U请求中有一个输入错误-应该以“\r\n\r\n”结尾。http服务器是否可能因为您的请求不完整而不发送任何响应?这会使您的fgetc调用受阻。是的,如果您从服务器收到应答,请尝试检查例如tcpdump或wireshark…一旦您开始返回数据,我认为您需要添加自己的代码来发现http响应的结尾,而不是假设fgetc将返回EOF。如果服务器使您的连接保持活动状态,则较低级别的代码无法推断EOF。“while循环永远不会结束。”我猜您的意思是,fgetc“挂起”等待输入或EOF,而不是while循环继续滚动和打印字符?或者,将
连接:close
作为HTTP/1.1标头的一部分。而且,如果将此代码用于通用HTTP连接,请确保也包括
主机:
头,因为许多网站使用“命名虚拟主机”并需要该头。
int main(int argc, char *argv[]) {

    int conn_s = socket(AF_INET, SOCK_STREAM, 0);
    struct addrinfo hints;
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = 0;

    struct addrinfo *addr = (struct addrinfo *) calloc(1, sizeof(struct addrinfo));

    getaddrinfo("google.com", "80", &hints, &addr);

    connect(conn_s, addr->ai_addr, sizeof(struct sockaddr_in));

    char *http_request = "GET / HTTP/1.1\n\n";

    send(conn_s, http_request, strlen(http_request), 0);
    FILE *sockfile = (FILE *) fdopen(conn_s, "r");
    FILE *fp = fopen("/Users/leekaiwei/Desktop/results.html", "w+");
    int ch;

    while ((ch = fgetc(sockfile)) != EOF) {
        fprintf(fp, "%c", ch);
    }

    close(conn_s);
    fclose(fp);
    fclose(sockfile);
    free(addr);
    return 0;
}