如何用单线程实现TCP上的全双工通道?

2024-06-18

我正在编写的网络库需要通过 TCP 套接字发送和接收消息。消息可以随时发送或接收,即应该作为全双工通道工作。

我能够使用两个线程来实现这样的场景:调用 send() 的主线程和一个主要在 receive() 调用处阻塞的专用线程。

我的问题是:是否可以用单线程实现相同的场景? IE。通过注册一些回调函数?

附带说明:我需要用 C++、Java 和 Python 实现这个场景。


是的,有可能。您需要使用允许多路复用 I/O 的 API。在 C/C++ 和 Python 下,您可以使用 select() 和非阻塞 I/O,因此您阻塞的唯一网络调用就是 select()。还有 poll() 和 epoll() 以及许多其他类似的 API 可以完成相同的任务,但效率和可移植性程度不同。 Java有非阻塞 I/O API http://www.owlmountain.com/tutorials/NonBlockingIo.htm#_Toc524339522 also.

另一种可能性是使用异步 I/O,您告诉操作系统启动 I/O 事务,并在完成操作时通知您(通过某种机制)。不过,我不熟悉这种网络编程风格,因此我不会尝试提供详细信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何用单线程实现TCP上的全双工通道? 的相关文章

  • SO_REUSEPORT 可以在 Unix 域套接字上使用吗?

    Linux 内核 gt 3 9 允许通过设置在内核负载平衡的进程之间共享套接字SO REUSEPORT http lwn net Articles 542629 http lwn net Articles 542629 这如何用于类型的套接
  • Discord-py Rewrite - Cog 中的基本 aiohttp Web 服务器

    我正在尝试将基本的 aiohttp 网络服务器集成到 Cog 中 使用 discord py 重写 我对齿轮使用以下代码 from aiohttp import web import discord from discord ext imp
  • TCP 校验和可能无法检测到错误吗?如果是的话,这件事是如何处理的?

    如果 TCP 有效负载在传输过程中被损坏 则重新计算的校验和将与传输的校验和不匹配 太好了 到目前为止一切都很好 如果 TCP 校验和在传输过程中损坏 则重新计算的校验和将与现在损坏的校验和不匹配 太好了 到目前为止一切都很好 当有效负载和
  • Chrome 在传输一定量的数据后挂起 - 等待可用的套接字

    我有一个浏览器游戏 最近我开始向游戏添加音频 Chrome 无法加载整个页面并卡在 91 requests 8 1 MB transferred 并且不再加载任何内容 它甚至破坏了所有其他选项卡中的网站 说Waiting for avail
  • 跨 NAT 的 UDP 客户端无法从服务器接收数据

    我正在尝试在服务器 在公共 IP 上 和客户端 跨 NAT 之间使用 UDP 进行双向通信 我的逻辑是 如果服务器将一些数据发送到 IP 和它接收数据包的端口 客户端仍然应该收到它 因为 NAT 将具有最终将数据包发送到客户端的映射 客户端
  • 当我退出应用程序时,如何删除 UNIX 域套接字文件?

    我有一个服务器应用程序 它在特定路径中创建一个 UNIX 域套接字 其名称和bind 到它 仅当我有意从应用程序代码中关闭 停止应用程序时 我才需要删除套接字 否则需要打开 我该怎么做呢 Thanks Edit 考虑一下我从终端内部启动并运
  • Linux 使用 boost asio 拒绝套接字绑定权限

    我在绑定套接字时遇到问题 并且以用户身份运行程序时权限被拒绝 这行代码会产生错误 acceptor new boost asio ip tcp acceptor io boost asio ip tcp endpoint boost asi
  • 使用套接字和 AsyncTask 强制关闭

    堆栈的人们大家好 请参阅下面我的班级代码和我的 LogCat 尝试连接时我受到强力关闭 如果有人能帮助我找出原因 我将不胜感激 基本上代码的作用是 从意图中获取 IP 地址 连接到端口 32 的 IP 然后发送一个命令 等待响应并发送另一个
  • 如何用单线程实现TCP上的全双工通道?

    我正在编写的网络库需要通过 TCP 套接字发送和接收消息 消息可以随时发送或接收 即应该作为全双工通道工作 我能够使用两个线程来实现这样的场景 调用 send 的主线程和一个主要在 receive 调用处阻塞的专用线程 我的问题是 是否可以
  • 无需超级用户即可在 Linux 中打开 RAW 套接字

    我必须编写一个在 Linux 上运行的 ping 函数 语言是 C 所以 C 也可以 在网上搜索并查看源代码ping命令 事实证明我应该创建一个原始套接字 icmp sock socket AF INET SOCK RAW IPPROTO
  • 通过套接字的身份验证方法

    我正在尝试通过套接字进行身份验证sailsjs and passport 挑战似乎在于套接字连接没有会话 并且 sailsjs 模拟请求对象 导致它没有 Passport 中间件设置 这导致nodejs抛出一个错误 说req对象没有调用的方
  • 如何将 Flutter 应用连接到 tcp 套接字服务器?

    我很难将 Flutter 应用程序连接到服务器上的网络 tcp 套接字 我知道我必须使用某种中间选项 以便在 tcp 套接字到 flutter 以及 Flutter 到 tcp 套接字之间转换数据 任何想法 信息如何实现这一目标 问题是如何
  • 如何同时支持 IPv4 和 IPv6 连接

    我目前正在开发 UDP 套接字应用程序 需要构建支持 以便 IPV4 和 IPV6 连接可以将数据包发送到服务器 我希望有人能帮助我并为我指明正确的方向 我发现的大部分文档都不完整 如果您能指出 Winsock 和 BSD 套接字之间的任何
  • 为什么假设 send 可能返回的数据少于在阻塞套接字上传输的请求数据?

    在流套接字上发送数据的标准方法始终是调用 send 并写入一大块数据 检查返回值以查看是否发送了所有数据 然后再次调用 send 直到整个消息被接受 例如 这是一个常见方案的简单示例 int send all int sock unsign
  • 如何禁用 fread() 中的缓冲?

    我正在使用 fread 和 fwrite 读取和写入套接字 我相信这些函数用于缓冲输入和输出 有什么方法可以在仍然使用这些功能的同时禁用缓冲吗 Edit 我正在构建一个远程桌面应用程序 远程客户端似乎 落后于服务器 我不知道可能是什么原因
  • C# 套接字编程 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 嘿 我对 C 异步套接字编程做了噩梦 您能给我指点一本深入解释异步编程的指南 教程或书籍吗 如果可能包
  • 开放、安全的 TCP 通道的安全期限有多长?

    我们有一个网络服务 充当我们的客户和其他服务之间的网关 客户端向第三方服务发送消息并从第三方服务接收随机消息 客户端的服务器通过安全套接字打开到我们的 Web 服务器的通道 以便接收传入的消息 并且不必每隔几分钟轮询一次服务器 我的问题是
  • C 中的字节顺序和套接字编程

    我正在制作一个使用 C 套接字与某些患者监视器进行通信的程序 我使用无连接套接字 UDP 与设备进行通信 但我的计算机和设备之间存在字节顺序不匹配 到目前为止 我这样做是为了从患者监视器获取解析响应 recvfrom int socket
  • 何时调用setsockopt?在bind()和connect()之前?

    我继承了一些 TCP 代码 调用 bind tcpSocket struct sockaddr server addr sizeof server addr 在致电之前 setsockopt tcpSocket SOL SOCKET SO
  • 跟踪数据包通过内核 (linux)

    我有两台机器设置为使用 Ip Security 机器 A 我们称它们为 A 和 B 有一个套接字 该套接字绑定到本地机器上的特定 UDP 端口 并且它经常轮询它以查看是否收到任何内容在上面 当我禁用 IP 安全性时 两台机器之间的数据可以正

随机推荐