为什么TClientSocket不会关闭连接???(200分)

  • 主题发起人 主题发起人 honestman
  • 开始时间 开始时间
H

honestman

Unregistered / Unconfirmed
GUEST, unregistred user!
我用TClientSocket(ctBlocking)和TServerSocket(stThreadBlocking)进行通讯。
结果发现,TServerSocket线程已经断开了与TClientSocket的连接,
不过,TClientSocket.Active仍然显示是True。
为什么会这样?如何解决这个问题?

 
给点码码瞧瞧。
 
WSAEnumNetworkEvents可以得到系列WSACreateEvent关联的Socket状态,但不知你的做法是怎
样的。如果你在select状态,可以进行
try
recv
except
error, and close socket
end;

如果是线程 + WSA + WaitFor的话,看看这里
http://expert.csdn.net/Expert/TopicView.asp?id=1210492
 
不是不关闭,是要等一段时间才关闭,主要是因为TCP处于TIME-WAIT状态,
可以设置(SetSockOpt)Socket的 SO_LINGER 和 SO_DONTLINGER 选项来解决
参见:http://delphibbs.sumaster.com/delphibbs/dispq.asp?lid=1506217
 
to zw84611
楼主他的问题不是这样,你那贴子所解决的是server端,而不是client端,楼主的问题是
在client中,server已经close了,但Client就是没显示出来,Active还是True.不过还是学
了点东西。
[:D][:D][:D][:D][:D][:D][:D][:D][:D]

我看了Borland在VCL的代码基本上都没有Thread + Blocking的侦听close事件的例子,在
DFW看到过一些,就是用WSAAsyncSelect关联close事件(异步),如果是Thread + Blocking
则用WSAEventSelect关联,用WSAEnumNetworkEvents进行检测。而Delphi中的作法是WaitFor
后进行recv,因为socket is close的话,那会except,那么就算是一端close了。。。
 
组塞下要自己手动关闭连接。。。在非组塞下是VCL关闭连接
 
多人接受答案了。
 
后退
顶部