首页 文章

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

提问于
浏览
0

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

Long story:

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

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

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

我该如何防止这种行为?

2 回答

  • -1

    TCP数据包不能丢失(它们可以但是在整个不同的层上) .
    如果存在通信错误,则套接字将关闭 .
    但是,如果您选择了接收超时,则没有理由不能再次尝试 .

    检查This .
    Read the remarks here.

  • 1

    问题是数据包可能会丢失

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

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

    不,不会 . 它只会在您关闭时关闭 .

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

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

    我该如何防止这种行为?

    捕获超时异常时,请勿关闭套接字 .

相关问题