简单地说,是否可以在捕获到TimedOut异常后重用套接字?我该怎么办?
长篇故事:
我有2个线程,都使用相同的套接字。一个是将数据包(让我们称之为线程A)发送到远程服务器,而另一个(线程B)正在侦听那些发送数据包的确认数据包。线程A将在满足某些条件时暂停(使用Monitor.Wait
),等待Monitor.Pulse
继续。当线程B收到一个数据包时,它调用Monitor.Pulse
并且线程A继续做它的事情......
问题是数据包可能会丢失,并且线程B将无限期地等待线程A等待脉冲时不会接收的数据包。整个程序将“阻止”。我的第一个想法是设置接收超时并捕获相关的异常。当发生这种情况时,我调用Monitor.Pulse
并且线程A可以继续,而线程B将继续等待另一个数据包。
但这不起作用。当捕获到异常时,套接字将关闭,当线程A尝试发送新数据包时应用程序将崩溃,因为它们使用相同的套接字。
如何防止此行为?
答案 0 :(得分:1)
问题是数据包可能丢失
不,他们不能。 TCP不会丢失数据包。如果丢失数据包,则代码中存在错误,或者发件人未发送错误。这里没问题。
捕获异常时,套接字将关闭
不,它没赢。它只会在你关闭它时关闭。
当线程A尝试发送新数据包时,应用程序将崩溃,因为它们使用相同的套接字。
仅在捕获超时异常时关闭套接字。所以不要这样做。
如何防止此行为?
当你发现超时异常时,不要关闭套接字。
答案 1 :(得分:-1)
TCP数据包不能丢失(它们可以但是在整个不同的层上) 如果存在通信错误,则插座将关闭 但是,如果您正在使用UDP通信并且已选择接收超时,则没有理由不能再次尝试。