gpt4 book ai didi

c - 在不关闭套接字的情况下停止阻塞接收

转载 作者:太空宇宙 更新时间:2023-11-04 04:23:42 26 4
gpt4 key购买 nike

我正面临与套接字和多线程相关的设计问题。

让以下事情:

  • 一组网络协议(protocol),其底层是使用 TCP/IP 的套接字层。

  • “发送者”线程:

    • 执行连接过程(涉及发送和接收数据)

    • 建立连接后,启动一个在后台接收数据的“接收方”线程。

    • 发送数据。

    • 当应用程序决定退出时,停止接收线程。

    • 执行断开连接(也涉及发送和接收数据)。

  • 在数据交换阶段(即在连接和断开连接之间)接收数据的“接收方”线程。

我的问题是,当发送方线程要执行断开连接过程时,它首先需要停止接收方线程。因为接收器线程正在执行阻塞接收,所以我知道停止它的唯一方法是粗暴地关闭套接字。但是这样做会阻止我执行干净的断开连接,因为断开连接过程需要在关闭套接字之前发送和接收数据。

所以我的问题是:是否可以在不关闭套接字的情况下停止阻塞接收,如果可以,我该怎么做?还是我需要重新设计我的应用程序?

我可以为我的阻塞接收添加超时,以便定期检查是否停止接收,但它会感觉不是很灵敏,而且似乎是一种肮脏的方法。

我不会用完整的代码来打扰您,因为它可以按预期工作并且具有依赖性。我的接收是使用 select() 然后是 recv() 执行的,如下所示:

iRes = select( 0, & fdRead, NULL, NULL, m_nTmout == 0 ? NULL : & tv );
...
iRes = recv( m_hSock, (char *) pBytes, nMaxLen, 0 );

这是 Win32 代码,但我在 Linux(更具体地说是 Android)上也有类似的代码。在这两种情况下,我都使用 C 和 C++。

谢谢。

最佳答案

当您使用 select() 作为阻塞操作时,您可以创建 pipe() 以将命令从发送者 传递到 < em>接收器。

通过将该管道的读取端添加到select() 读取列表,您可以确定写入该管道的任何命令都会唤醒select() 调用.因此接收方将能够处理此命令。

关于c - 在不关闭套接字的情况下停止阻塞接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43800791/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com