在tcl(在Windows上为tcl 8.4或8.6)中,关闭套接字连接似乎并不能优雅地终止基础TCP / IP连接。
下面的代码显示了一个简单的时间服务器和关联的客户端。与客户端建立连接后,服务器将发送当前时间和服务器正常运行时间,然后关闭连接。客户端在从服务器读取响应后,也会关闭其一侧。但是,底层的tcp / ip连接在超时之前会停留在“ TIME WAIT”状态的僵尸连接30秒。
一旦这些僵尸连接同时存在数千个,代码最终就会崩溃,并显示“无法连接到服务器”消息等。
有没有办法防止这种情况并正常终止基础的tcp / ip连接?
#server
proc Server {startTime channel clientaddr clientport} {
puts "Connection from $clientaddr registered"
set now [clock seconds]
puts $channel [clock format $now]
puts $channel "[expr {$now - $startTime}] since start"
close $channel
}
socket -server [list Server [clock seconds]] 9900
vwait forever
#client
set server "127.0.0.1"
set sockChan [socket $server 9900]
gets $sockChan line1
gets $sockChan line2
close $sockChan
puts "The time on $server is $line1"
puts "That is [lindex $line2 0]s since the server started"
Output from currport (zombie connection)
==================================================
Process Name : Unknown
Process ID : 0
Protocol : TCP
Local Port : 9900
Local Port Name :
Local Address : 127.0.0.1
Remote Port : 27524
Remote Port Name :
Remote Address : 127.0.0.1
Remote Host Name :
State : Time Wait
答案 0 :(得分:1)
现在转载好:TIME_WAIT
中大量套接字的泛滥几乎可以观察到每个套接字(如果立即打开和关闭)。
通常情况恰好相反,因此默认情况下,closesocket
之后,Windows执行“正常关机”(以使发送排队的数据成为可能),但是由于某些原因,不利因素导致此类洪水,而“半”关闭或长时间打开套接字,尽管没有什么可发送的(可能有一个通知数据包“套接字即将关闭”)。
我调查了一下(很奇怪),现在在tcl-core中打开了一张票
[b6d0d8cc2c]。
我将尝试为此提供一些解决方案。
感谢您通知我们。