【发布时间】:2019-12-12 18:37:36
【问题描述】:
我目前正在尝试开发一个服务器和一些客户端,它们使用中间的代理之类的东西相互通信。 “代理”将为系统上的每个客户端和服务器打开套接字。这意味着我目前正在使用线程来保持所有连接打开。每次客户端决定发送消息时,它都会将其套接字与代理一起使用并发送消息。然后代理将使用相应的套接字将消息传播到每个其他节点。
如您所见,节点可以通过让代理写入套接字来接收消息,或者节点可能希望通过写入套接字来发送消息。 如何保证套接字中的内容不会被覆盖?我是否必须使用互斥锁来锁定对套接字的访问?解决这个问题的好习惯是什么?
【问题讨论】:
-
小心 如果客户端通过对
write的一次调用发送一条消息,则代理最终可能会通过两次对read的调用来读取该消息。类似地,如果客户端通过两次调用write发送两条消息,则代理可以通过一次读取调用来读取它们。您需要在代理中进行一些缓冲,以避免消息碎片化,并且(特别是)避免其他客户端接收交错的两条消息。 -
或者客户端发送两条消息,代理最终以
reading 发送所有一条消息和一小部分第二条消息(然后第二次调用结束于其余消息)。 -
@MartinBonner:不知道我们在说什么套接字,你不能这么说。 UDP 不会分片。这是 UDP 固有的;因为它是无连接的,所以您无法连接来自两个
reads 的结果。所以read不允许对UDP数据包进行分片。 -
完全不用线程,不用线程会轻松很多。
-
@MSalters - 哦,好收获!你说得对,我假设是 TCP 套接字。 (但是如果你使用 UDP,那么你会牺牲可靠性——这可能并不重要,特别是如果这是一个仅限 LAN 的应用程序)。
标签: c++ multithreading sockets mutex