予程序的服務器通過蟒發送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