线程完成时套接字不会关闭

时间:2014-11-27 21:12:13

标签: c# .net sockets

套接字有问题。这样:

enter image description here

当客户端线程结束时,服务器尝试读取并冻结,因为套接字未关闭。当它结束时,线程不要关闭它。它的问题存在,如果我使用线程,但如果我使用两个独立项目,我没有问题(异常抛出,我可以抓住它)。 我不能使用超时,我必须纠正继续服务器工作,当客户端不关闭套接字。 对不起我的坏人。

2 个答案:

答案 0 :(得分:4)

据我所知,TCP服务器(侦听器)无法确定客户端的数据是否因为已经死亡/退出或仅处于非活动状态而未来。这不是.NET的低效,而是TCP的工作方式。我处理它的方式是: 1.在我的客户端创建一个定时发送信号的计时器"我还活着#34;到服务器。例如,我只发送1个不常见的ASCII字符'∩' (代码239)。 2.在TCP侦听器中:使用允许指定超时的NetworkStream.Read(...)方法。如果超时到期,则服务器处理旧的NetworkStream实例并在同一TCP端口上创建新的实例。如果服务器收到"我还活着"来自客户的信号,它一直在倾听。

顺便说一句,属性TcpClient.Connected对于在服务器端检测客户端是否仍使用套接字是无用的。如果上一次Read操作返回了某些内容,则该方法仅返回true。因此,如果客户端处于活动状态且只是静默,则TcpClient.Connected将变为false。

答案 1 :(得分:2)

关闭client时,请关闭Client

更好的是,将using用于所有可支配资源,例如客户端和监听器。