是否可以在TimeOut异常后重用套接字?

时间:2012-05-10 20:50:22

标签: c# multithreading sockets socket-timeout-exception

简单地说,是否可以在捕获到TimedOut异常后重用套接字?我该怎么办?

长篇故事:

我有2个线程,都使用相同的套接字。一个是将数据包(让我们称之为线程A)发送到远程服务器,而另一个(线程B)正在侦听那些发送数据包的确认数据包。线程A将在满足某些条件时暂停(使用Monitor.Wait),等待Monitor.Pulse继续。当线程B收到一个数据包时,它调用Monitor.Pulse并且线程A继续做它的事情......

问题是数据包可能会丢失,并且线程B将无限期地等待线程A等待脉冲时不会接收的数据包。整个程序将“阻止”。我的第一个想法是设置接收超时并捕获相关的异常。当发生这种情况时,我调用Monitor.Pulse并且线程A可以继续,而线程B将继续等待另一个数据包。

但这不起作用。当捕获到异常时,套接字将关闭,当线程A尝试发送新数据包时应用程序将崩溃,因为它们使用相同的套接字。

如何防止此行为?

2 个答案:

答案 0 :(得分:1)

  

问题是数据包可能丢失

不,他们不能。 TCP不会丢失数据包。如果丢失数据包,则代码中存在错误,或者发件人未发送错误。这里没问题。

  

捕获异常时,套接字将关闭

不,它没赢。它只会在关闭它时关闭。

  

当线程A尝试发送新数据包时,应用程序将崩溃,因为它们使用相同的套接字。

仅在捕获超时异常时关闭套接字。所以不要这样做。

  

如何防止此行为?

当你发现超时异常时,不要关闭套接字。

答案 1 :(得分:-1)

TCP数据包不能丢失(它们可以但是在整个不同的层上) 如果存在通信错误,则插座将关闭 但是,如果您正在使用UDP通信并且已选择接收超时,则没有理由不能再次尝试。

检查ThisRead the remarks here.