C++ 在同一套接字c+上进行多次写入+; 我正在尝试开发一个服务器和一些客户端,它们使用中间的代理进行通信。“代理”将为系统上的每个客户端和服务器打开套接字。这意味着我目前正在使用线程保持所有连接打开。每次客户端决定发送消息时,它都会使用其套接字和代理一起发送消息。然后代理将使用相应的套接字将消息传播到每个其他节点

C++ 在同一套接字c+上进行多次写入+; 我正在尝试开发一个服务器和一些客户端,它们使用中间的代理进行通信。“代理”将为系统上的每个客户端和服务器打开套接字。这意味着我目前正在使用线程保持所有连接打开。每次客户端决定发送消息时,它都会使用其套接字和代理一起发送消息。然后代理将使用相应的套接字将消息传播到每个其他节点,c++,multithreading,sockets,mutex,C++,Multithreading,Sockets,Mutex,如您所见,节点可以通过在套接字上写入代理来接收消息,或者节点可能希望通过在套接字上写入来发送消息。 如何保证套接字中的内容不会被覆盖?我必须使用互斥锁来锁定对套接字的访问吗?解决此问题的最佳做法是什么?连接是双向的。单向内容不会覆盖反向内容。此操作不需要互斥 此外,您也不能使用互斥锁,因为连接的双方都是分开的。如果客户端通过对write的一次调用发送一条消息,那么代理可能会通过对read的两次调用来读取该消息。类似地,如果客户机发送两条消息并调用两次write,则代理可以通过一次调用read来读

如您所见,节点可以通过在套接字上写入代理来接收消息,或者节点可能希望通过在套接字上写入来发送消息。
如何保证套接字中的内容不会被覆盖?我必须使用互斥锁来锁定对套接字的访问吗?解决此问题的最佳做法是什么?

连接是双向的。单向内容不会覆盖反向内容。此操作不需要互斥


此外,您也不能使用互斥锁,因为连接的双方都是分开的。

如果客户端通过对
write
的一次调用发送一条消息,那么代理可能会通过对
read
的两次调用来读取该消息。类似地,如果客户机发送两条消息并调用两次
write
,则代理可以通过一次调用read来读取这两条消息。您需要在代理中进行一些缓冲,以避免消息碎片化,并(特别是)避免其他客户端接收到两条交错的消息。或者客户端发送两条消息,代理最终读取所有一条消息和一部分第二条消息(然后第二次调用以其余消息结束)@MartinBonner:如果你不知道我们在说什么插座,你就不能这么说。UDP不分片。这是UDP固有的;因为它是无连接的,所以无法将两个
read
s的结果连接起来。因此,
read
不允许对UDP数据包进行分段。您根本不必使用线程,而且没有线程会容易得多。@MSalters-ooh,捕捉得好!你说得很对,我假设是TCP套接字。(但如果您使用UDP,那么您就牺牲了可靠性——这可能无关紧要,尤其是对于仅限于LAN的应用程序)。