0

简而言之,是否可以在捕获 TimedOut 异常后重用套接字?我该怎么做?

很长的故事:

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

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

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

如何防止这种行为?

4

2 回答 2

1

问题是数据包可能会丢失

不,他们不能。TCP 不会丢失数据包。如果您丢失了数据包,那么您的代码中有错误,或者发送者没有发送它们。这里还没有问题。

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

不,不会的。只有当你关闭它时它才会关闭。

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

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

如何防止这种行为?

捕获超时异常时不要关闭套接字。

于 2016-05-22T02:05:48.587 回答
-1

TCP 数据包不会丢失(它们可以,但那是在一个完全不同的层上)。
如果出现通信错误,套接字将关闭。
但是,如果您使用的是 UDP 通信并且您选择了接收超时,那么您没有理由不能再试一次。

看看这个
在此处阅读备注。

于 2012-05-30T23:45:18.613 回答