2016-09-04 22 views
1

ホスト名を解決しようとしていて、ホストでソケットを開いたり閉じたりしようとしています。TIME_WAIT状態のソケット接続に接続する

以下のコードは正常です。私が持っている問題は、接続が正しく閉じられていないようです。私はTIME_WAITSの山が残っています:

tcp  0  0 192.168.142.139:44475 172.217.23.14:443  TIME_WAIT 
tcp  0  0 192.168.142.139:44362 45.79.5.162:80   TIME_WAIT 
tcp  0  0 192.168.142.139:44373 45.79.5.162:80   TIME_WAIT 
tcp  0  0 192.168.142.139:44461 172.217.23.14:443  TIME_WAIT 
tcp  0  0 192.168.142.139:44468 172.217.23.14:443  TIME_WAIT 
tcp  0  0 192.168.142.139:44472 172.217.23.14:443  TIME_WAIT 
tcp  0  0 192.168.142.139:44474 172.217.23.14:443  TIME_WAIT 
tcp  0  0 192.168.142.139:44459 172.217.23.14:443  TIME_WAIT 
tcp  0  0 192.168.142.139:44470 172.217.23.14:443  TIME_WAIT 
tcp  0  0 192.168.142.139:44463 172.217.23.14:443  TIME_WAIT 
tcp  0  0 192.168.142.139:44464 172.217.23.14:443  TIME_WAIT 

私は特にそれが一般的なインターネットのチェックの多くはで、ホストに固有のものを送信する必要はありません。私はまた、ノンブロッキング接続を使用し、それに続いてselectを試しました。同じ結果。

int port = 443; 
    char *hostname = "google.com"; 

    int open_socket(char *ip) 
    { 
    int error = 0; // Socket error 
    struct sockaddr_in address; 
    short int sock = -1; 
    fd_set fdset; 
    struct timeval tv; 
    int so_keepalive = 0; 

    sock = socket(PF_INET, SOCK_STREAM , 0); 
    if (sock < 0) 
     return 150; 

    address.sin_family = AF_INET; 
    address.sin_addr.s_addr = inet_addr(ip); 
    address.sin_port = htons(port); 
    /* address.sin_addr.s_addr = INADDR_ANY; */ 

    FD_ZERO(&fdset); 
    FD_SET(sock, &fdset); 
    tv.tv_sec = 3; 
    tv.tv_usec = 0; 

    int yes = 1; 
    // setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int)); 
    // setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)); 
    setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof(struct timeval)); 
    setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &so_keepalive, sizeof(so_keepalive)); 

    if (connect(sock, (struct sockaddr *)&address , sizeof(address)) < 0) 
     error = 150; 

    if (error == 0) { 
     char *message = "HELLO"; 
     if (send(sock , message , strlen(message) , 0) < 0) 
     error = 180; 

     char server_reply[2000]; 
     if(recv(sock, server_reply , 2000 , 0) < 0) 
     error = 190; 
    } 

    /* shutdown(sock, SHUT_RDWR); */ 
    close(sock); 
    return error; 
    } 

    int connection_check() 
    { 
    struct addrinfo *result; 
    struct in_addr addr; 

    int error; 

    error = getaddrinfo(hostname, NULL, NULL, &result); 
    if (error != 0) 
    { 
     fprintf(stderr, "DNS Lookup Failed: %s\n", gai_strerror(error)); 
     return 100; 
    } 

    addr.s_addr = ((struct sockaddr_in *)(result->ai_addr))->sin_addr.s_addr; 
    printf("\nUsing %s for internet check\n", inet_ntoa(addr)); 
    freeaddrinfo(result); 
    return(open_socket(inet_ntoa(addr))); 
    } 

誰かがこれを正しく処理する方法を提案できますか。

+2

あなたはこれを正しく処理していますか、少なくとも解決するここでの問題はありません。 TIME_WAIT状態はTCPの通常の部分です。それは数分続く。 – EJP

+0

私は一般的に、私が何かを適切に閉じていないと懸念していました。私は無視し続けます。ありがとう –

答えて

0

TCPは からのパケットがなくなるまで接続ブロック同じホスト/ポート対にさらに 接続を閉じるエンドポイントは、接続がネットワーク内に残っていることをことを必要とします。

接続を一時的にブロックするには、1つのエンドポイントが、TCP コントロールブロック(TCB)のコピーを保持して、接続が終了したことを示します( )。このような接続は、TIME-WAIT状態にあります。 での接続TIME-WAITはCLOSEDに移動され、同じ接続からのすべてのパケットがネットワーク を残しているのに十分な時間が経過した後で、そのTCBは破棄されます。パケットは、 エンドポイントの1つに到着し、拒否されるか、または有効期限が切れた有効時間がルータに到着し、削除されることによってネットワークから去ります。

http://www.isi.edu/touch/pubs/infocomm99/infocomm99-web/

+0

これは答えですか? –

+0

それがあなたを助けたら、それはそうではないなら、そうではありません;) –