写入(提升 asio)TCP 套接字:一个接一个或同时写入所有套接字
writing to (boost asio) TCP sockets: one by one or all at the same time
我有一个TCP服务器,我必须同时将数据发送到多个套接字。我正在使用提升来做到这一点。
当我需要将数据发送到多个套接字时,我会调用每个套接字boost::asio::async_write
我想发送的任何数据。
我想知道在一个套接字上呼叫boost::asio::async_write
并等待回电(然后在下一个套接字上调用它......
等待来自async_write的回调只会引入(本质上是随机的)延迟,但根本没有给你带来任何好处。
唯一的例外是底层协议没有任何拥塞控制 - 即在使用UDP时,您可能希望在应用程序中实现某种拥塞控制,但即使这样,等待async_write回调也不是一个好主意(因为这只是告诉您数据已传递到操作系统)。
但是,当您使用 TCP 时,等待回调不会提供任何好处。
请注意,
我不是网络专家,所以如果我在这里弄错了,请随时发表评论。
异步:
进行异步调用的优点是在调用后立即返回控制。因此,当我们等待验证呼叫状态时,我们可以做其他更高效的事情或产生CPU。这使得异步系统高效。
缺点是很难进行异步调用。它们不需要呼叫通信结果的锁和机制。这可能很难实现。
同步:
进行同步调用的优点是它们更易于实现和理解。
缺点是它们会阻塞,直到获得结果。这会使系统非常慢,并且可能会死锁。
当async_write
操作发生错误或写入所有数据都写入套接字时,WriteHandler 是可运行的。 因此,跨不同套接字发出多个异步写入可能会导致速度提高。 但是,需要格外小心才能正确管理缓冲区。
- 如果缓冲区由
shared_ptr
管理,则只需将shared_ptr
绑定到每个 WriteHandler。 - 如果缓冲区不是由智能指针管理的,则需要有一种机制来检测何时调用了最后一个 WriteHandler。 请考虑将挂起的写入处理程序的计数存储到
pending_writes_
变量中,并让每个 WriteHandler 递减pending_writes_
。 一旦pending_writes_
达到零,缓冲区就可以重新用于其他操作。 要将修改序列化为pending_writes_
,请将每个 WriteHandler 包装在一个strand
中。
相关文章:
- 一个非常简单的win32套接字代码,但工作错误
- 在线程C++中创建一个套接字
- UDP 套接字读取最后一个传入字节
- 通过 c++ 中的 udp 套接字将派生类对象从一个进程发送到另一个进程
- 我正在编写一个简单的客户端套接字应用程序,但在连接后服务器收到一个空缓冲区
- 当我使用套接字代码发送第二条消息时,我有一个"sendto() Invalid argument"
- 是否可以寻址另一个网络中的服务器/客户端套接字?(C++)
- 我可以将一个套接字添加到多个 epoll 实例吗?
- 每个线程或每个调用一个 ZeroMQ 套接字
- QSocketNotifier:不能从另一个线程启用或禁用套接字通知程序
- 我正在尝试用 DevC++ 编译一个套接字程序,但每次我这样做时,我都会收到很多链接器错误,如下所示:
- 处理一个套接字和多个线程时异步 IO 的用例
- 服务器多线程无法保存最后一个套接字描述符
- 异步等待,直到在Asio中有一个套接字可用于读/写
- 同时等待一个条件(pthread_cond_wait)和一个套接字更改(select)
- 如何在一个套接字上实现并行请求和响应的非阻塞客户端-服务器通信模型,而不存在数据竞争
- 如何从一个套接字读取' 1 '字节,而从另一个套接字读取' read_some '字节
- 在android代码中创建一个套接字(而不是在android应用程序中)获得Permission Denied
- 通过ZeroMQ以字符串形式接收对象,然后通过另一个套接字以零拷贝发送对象的正确方法是什么
- 线程中一个套接字发送/接收