予程序的服务器通过蟒发送DATAS到客户端,代码如下:在Linux和python上,什么使套接字超时?
server.py
import socket,time
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #just for test
sock.bind(("10.144.74.182",8080))
sock.listen(10)
s,info=sock.accept()
s.settimeout(60)
while 1:
try:
t=time.time()
s.send("a"*4096)
print time.time()-t
except:
print time.time()-t
break
client.py程序的
import socket,time
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect(("10.144.74.182",8080))
while 1:
time.sleep(5)
a=sock.recv(4096)
部分输出:
但是,运行该程序时服务器超时。我的问题是为什么服务器超时如果网络是好的?客户端每5秒收到一次数据是否会导致服务器超时?
通过tcpdump,我发现当客户端的tcp recv窗口大小再次大于零时,客户端不会立即通知服务器,它会通知服务器,直到它的recv窗口大小超过某个特定值值,这可以从后续的PIC可以看出:
从PIC我们可以看到客户端noitfy服务器时,它的窗口大小为26368.Is有任何人知道的recv窗口的阈值大小,使客户端通知服务器?
如果您想跟踪客户端,请勿使用'timeout'。另一点是“超时”仅适用于单个数据包(不是全部通信)。 – dsgdfg
你说什么“不全面沟通”是什么意思? – Jay
超时通常定义连接是否存在或系统最长的等待时间。此超时仅适用于单个数据包。它不用于文件或流控制,因为网络的状态和资源可访问性不稳定。出于这个原因,在套接字应用程序中使用附加的数据块和标志。如果要建立高速且充足的连接,超时功能将不起作用(忽略)。如果要建立关键数据连接,则状态和线路负载信息以特定时间间隔(<200毫秒)进行交换。 – dsgdfg