- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试解析主机名,然后打开/关闭与主机的套接字。
下面的代码工作正常。我遇到的问题是连接似乎没有正确关闭。我只剩下一堆 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
我并不特别需要向主机发送任何特定内容,它更像是一个一般的互联网检查。我也尝试过使用非阻塞连接,然后是选择来进行相同的尝试。相同的结果。
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)));
}
有人可以建议我应该如何正确处理这个问题。
最佳答案
TCP requires that the endpoint that closes a connection blocks further connections on the same host/port pair until there are no packets from that connection remaining in the network.
To temporarily block connections, one endpoint keeps a copy of the TCP control block (TCB) indicating that the connection has been terminated recently. Such a connection is in the TIME-WAIT state. Connections in TIME-WAIT are moved to CLOSED and their TCB discarded after enough time has passed that all packets from the same connection have left the network. Packets leave the network by arrive at one of the endpoints and being rejected, or arriving with an expired time-to-live (TTL) field at a router and being deleted.
关于连接到套接字使连接处于 TIME_WAIT 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39317137/
我遇到了一个网络服务器问题,该服务器从我公司生产的设备接收信号。设备偶尔会重用它刚刚使用过的源端口。这会导致 SYN 被服务器丢弃。然后设备会重试,直到旧套接字超出服务器上的 TIME_WAIT 时间
我正在尝试避免客户端出现 TIME_WAIT。我连接然后设置 O_NONBLOCK 和 SO_REUSEADDR。我调用 read 直到它返回 0。当 read 返回 0 时,errno 也为 0。我
我正在尝试解析主机名,然后打开/关闭与主机的套接字。 下面的代码工作正常。我遇到的问题是连接似乎没有正确关闭。我只剩下一堆 TIME_WAITS: tcp 0 0 192.16
当我在现场检查 mysql 加载时间时。我得到的结果显示连接为 TIME_WAIT。即使我关闭了每一页上的连接。有时网站不会加载说连接太多。有什么办法可以解决这个问题? 提前感谢您的任何回复或建议 最
我试图通过设置 tcp_fin_timeout 来减少连接处于 TIME_WAIT 状态的时间 详细 here : root:~# sysctl -w net.ipv4.tcp_fin_timeout
我在 C# 中有一个 TCP 隧道。我需要打开和关闭隧道,这是我在服务器和客户端之间的应用程序。我正在使用它来关闭数据连接以测试另一个应用程序。我必须使用特定的端口。 根据我等待重新连接的时间长短,在
我正在尝试避免客户端出现 TIME_WAIT。我连接然后设置 O_NONBLOCK 和 SO_REUSEADDR。我调用 read 直到它返回 0。当 read 返回 0 时,errno 也为 0。我
这个问题在这里已经有了答案: Bind error while recreating socket (4 个答案) 关闭 8 年前。 我知道您会将其掩盖为重复项(question1、question
我设置了一个 TCP 服务器/客户端,它们按照我通常想要的方式进行通信。 我现在想做的是添加允许客户端在连接丢失后自动重新连接到服务器的功能。我无法在线找到有关如何执行此操作的完整信息。 详细信息:-
我开发了一个包含 tcp 服务器的服务。 当我重新启动我的应用程序时,有时我的应用程序无法绑定(bind) TIME_WAIT 的端口原因。 在我的应用程序中,我想在绑定(bind)失败时添加一个过程
我们有一个使用 Apache mod 代理的相当繁忙的网站(每天 100 万页浏览量),该代理在 TIME_WAIT 状态下不断因连接(>1,000)而过载。连接到端口 3306 (mysql),但
在以下情况下,当 TIME_WAIT 中的套接字收到一个段时会发生什么 a) 当它收到丢失的ACK时 b) 当发送节点想要使用服务器上的相同 src_ip:src_port 与服务器已经具有 TIME
假设我有一台服务器运行日间服务。 然后我用telnet连接这个白天服务器,服务器发送时间数据并关闭连接,现在,因为服务器是主动关闭端,应该进入TIME_WAIT状态。 那么,为什么我可以在最后一次 t
我已阅读相关问题: What is the cost of many TIME_WAIT on the server side? 但我还是迷路了。我们有两台应用服务器和一台数据库服务器(都是云服务提供
因此,我在一台服务器上有应用程序 A,它每秒向另一台服务器上的应用程序 B 发送 710 条 HTTP POST 消息,该服务器正在监听单个端口。连接不是保持事件的;他们关门了。 几分钟后,应用程序
我正在编写一个简单的 HTTP 服务器并了解 TIME_WAIT。繁重环境中的真实 Web 服务器如何处理来自数千个用户的请求,而不会在处理请求后所有套接字都卡在 TIME_WAIT 中? (不询问保
我们正在尝试调整一个应用程序,该应用程序通过 TCP 接受消息并且还使用 TCP 进行某些内部消息传递。在负载测试时,我们注意到随着对系统同时发出更多请求,响应时间显着降低(然后完全停止)。在此期间,
我们将 haproxy 1.3.26 托管在配备 2.13 GHz Intel Xeon 处理器的 CentOS 5.9 机器上,该处理器充当众多服务的 http 和 tcp 负载均衡器,峰值吞吐量约
我正在尝试在 GCP 上设置 Aerospike 集群。我正在使用 Core OS 和 Docker 来运行 Aerospike 守护进程。 我在 aerospike.conf 中为 as-node-
我们使用 Apache 服务器作为前端服务器,使用 Tomcat 服务器作为后端。前端客户端是一个 java swing 应用程序。该协议(protocol)是粗麻布的。 有时我们会收到很多小请求。当
我是一名优秀的程序员,十分优秀!