gpt4 book ai didi

sockets - 针对不良网络的套接字编程

转载 作者:可可西里 更新时间:2023-11-01 02:47:05 24 4
gpt4 key购买 nike

客户:

socket(), connect() and then 
for (1 to 1024) {
write(1024 bytes)
}
exit(0);

服务器:

socket(), bind(), listen()
while (1) {
accept()
while((n = read()) {
if (n == -1) abort(); /* never happended */
total_read += n
}
close()
}

现在,客户端在 NAT 下运行在 Mac 上,服务器运行在我的 VPS 上(国外)

通常,它工作正常(客户端发送所有数据并退出并服务器接收所有数据)

然而,当客户端正在运行但突然网络中断几分钟(并重新恢复)时,客户端在很长一段时间后不会退出......我用 control + C 杀死它并再次运行它,服务器似乎不再读取数据(客户端仍在运行)

这是 netstat 显示的内容:

客户:

tcp4       0 130312  192.168.1.254.58573    A.B.C.D.8888    ESTABLISHED

服务器:

tcp        0      0 A.B.C.D:8888     a.b.c.d:54566      ESTABLISHED 10970/a.out     
tcp 102136 0 A.B.C.D:8888 a.b.c.d:60916 ESTABLISHED -

A.B.C.D 是我的 VPS 地址a.b.c.d 是我的公网客户端地址

我的问题是:

1、为什么?

2、服务端重启后正常,如何写代码不重启解决?

最佳答案

在 TCP 中,除非您尝试在连接上发送某些内容,否则无法判断连接已失败。 TCP 不执行连接的主动监视(实际上,有可选的“keepalive”数据包,但这些数据包通常在连接空闲几个小时后才会发送)。当您发送内容时,如果等待另一台机器返回确认超时,您最终会收到错误消息。但是,如果您只是在不发送数据的情况下读取数据,则无法判断连接已失败——看起来发送方没有任何要发送的数据。

您可以通过设计您的应用程序来解决此问题,以便要求客户端每 N 秒发送一次内容。然后在服务器中设置一个计时器,检测您在超过 N 秒内没有收到任何东西(您应该增加一点额外的时间以允许短暂的延迟)。

关于sockets - 针对不良网络的套接字编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21301854/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com