从套接字流中读取

时间:2016-10-25 15:23:34

标签: c sockets

我想使用套接字在C中创建一个简单的请求/响应应用程序。我已经达到了以下代码:

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netdb.h>



int main ( int argc, char* argv[] ) {

    struct addrinfo hints;
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = 0;
    hints.ai_flags = AI_PASSIVE;

    int currentChar = 0;

    struct addrinfo *addr;

    int conn_s = socket ( AF_INET, SOCK_STREAM, 0 );

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

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

    FILE* stream = fdopen( conn_s, "w+" );

    if ( stream != NULL ) {

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

        fprintf( stream, "%s", http_request );

        do {

            currentChar = fgetc( stream );
            printf( "%c", currentChar );

        } while ( currentChar != EOF );

        fclose ( stream );
        freeaddrinfo( addr );

    }

    return 0;

}

基本上,控制台显示流的结果(因此HTTP请求的响应),但似乎进程永远不会终止。从未达到该计划的结束。

我猜 currentChar 从不持有值 EOF ,但我不知道为什么。

1 个答案:

答案 0 :(得分:0)

这是因为HTTP / 1.1具有持久连接(也称为keepalive),您可以通过使用HTTP / 1.0并添加Connection: close标题

使每个请求后服务器断开连接