代码之家  ›  专栏  ›  技术社区  ›  Kazoom

退出TCP中的线程阻塞

  •  2
  • Kazoom  · 技术社区  · 15 年前

    我的服务器/客户端启动一个新线程“readerThread()”,用于读取传入的tcp流量。此线程在read()时阻塞。如何退出这个RealthTHead()。

    一种方法是启动另一个线程,在线程退出时关闭该套接字,从而读取将退出。有没有更干净/更好的方法来做这件事。

    5 回复  |  直到 15 年前
        1
  •  3
  •   ata    15 年前

    我误解了这个问题。这是我认为你应该做的。

    • 如果在父线程中创建了套接字 并且只使用新线程读取传入数据,然后我建议调用Socket。SututhTo()。这样,接收方法将返回0(没有字节读取),并且可以从线程的方法中退出。关闭将禁用发送/接收,但如果缓冲区中有任何数据正在等待发送/接收,它将确保在关闭套接字之前发送/接收该数据。当套接字在接收时被阻止时,如果调用shutdown,Receive方法将返回0,但它将引发套接字异常,错误代码为shutdown(或10058)。所以准备好抓住它并处理它。

    • 如果在新线程中创建套接字,并且它接受新连接(socket.Listen()和socket.Accept) 然后可以从父线程连接到该套接字并发送0字节。当接收方法返回0字节时,可以退出新线程。

    • 如果在新线程中创建套接字,并且它只能是一个客户端(连接到其他套接字) 那么这根本不是一个好办法。您可能必须中止线程(不推荐),除非您将服务器配置为在希望关闭客户端套接字时发送0字节,但这样您的客户端应用将依赖于服务器来关闭套接字。

        2
  •  1
  •   Walt W    15 年前

    如果您使用的是blocking read()命令,那么您几乎应该总是有另一个控制线程负责关闭它并清理套接字。

    不过,通常情况下,我会使用一个在1秒左右超时的select()调用来测试是否有要读取的数据,并且每个超时周期都会检查另一个线程是否设置了关闭状态标志。

    但是,如果您使用纯阻塞,请按照您的建议使用控制线程。

        3
  •  1
  •   REA_ANDREW    15 年前

    我会用一个不规则的套接字通信。我写了一篇文章在我的博客上演示了这一点。你可以在这里阅读:

    http://www.andrewrea.co.uk/blog/2009/06/09/Part1SocketProgrammingWithCJAVACAndActionScript30EstablishingABaseConnectionAndCommunicationWithCServerAndAS3.aspx

    安得烈

        4
  •  0
  •   Martin v. Löwis    15 年前

    我有点困惑你到底在做什么:在.NET中没有套接字类的read()方法。

    我的建议是创建第二个套接字,它监听一个特定的端口,并让线程块 Socket.Select 相反。连接到第二个套接字应被视为关闭请求(可能在适当的身份验证之后,例如通过该套接字发送应用程序密码)。

        5
  •  -1
  •   sipsorcery    15 年前

    另一种方法是,当您想关闭应用程序时,将0字节的数据包从您自己的应用程序中的其他位置发送到您的侦听套接字。

    我发现这是一个比从另一个线程关闭coket更干净的方法,因为如果关闭它的套接字,侦听线程将抛出异常。