0
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 を返さないだけです。

4

1 に答える 1

3

HTTP/1.1デフォルトはconnection: keepaliveであるため、simonc が言ったように、サーバーは実際には次のリクエストを待っており、サーバー依存のタイムアウトまで待機します。を取得するために使用HTTP/1.0しますEOF

FWIW: 完了するまでに 245 秒かかりました。

于 2012-11-06T16:18:06.520 に答える