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

标签 c loops eof infinite fgetc

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;
}

while 循环永远不会结束。为什么是这样?我已经用本地文件完成了此操作,效果很好。它也适用于 for 循环,只是 fgetc() 永远不会返回 EOF。

最佳答案

HTTP/1.1默认是connection: keepalive,所以就像simonc说的,服务器实际上是在等待你发出下一个请求,并且会等到服务器- 相关超时。 使用HTTP/1.0获取EOF

FWIW:完成需要 245 秒。

关于检查 EOF 时套接字/文件流上的 C fgetc() 进入无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13250143/

相关文章:

c++ - 错误的错误代码

c - 字符串化 CMake 预处理器 token

C++:std::istream 检查 EOF 而不读取/消耗 token /使用运算符>>

C++从文件函数读取无法在循环时退出

c++ - 与不同架构上的数据对齐相关的问题是什么?

c - 我的 c 代码中的本地 bool 代码有错误

MySQL存储过程,用变量定义CURSOR FOR

C# 用户输入 int 到数组

javascript - 使用jquery遍历行数超过500行和15列的表

c - EOF 上的意外 fgets 行为