ホスト名を解決しようとしていて、ホストでソケットを開いたり閉じたりしようとしています。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)));
}
誰かがこれを正しく処理する方法を提案できますか。
あなたはこれを正しく処理していますか、少なくとも解決するここでの問題はありません。 TIME_WAIT状態はTCPの通常の部分です。それは数分続く。 – EJP
私は一般的に、私が何かを適切に閉じていないと懸念していました。私は無視し続けます。ありがとう –