【问题标题】:Multiple writes on same socket c++在同一个套接字c ++上多次写入
【发布时间】:2019-12-12 18:37:36
【问题描述】:

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

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

【问题讨论】:

  • 小心 如果客户端通过对write 的一次调用发送一条消息,则代理最终可能会通过两次对read 的调用来读取该消息。类似地,如果客户端通过两次调用write 发送两条消息,则代理可以通过一次读取调用来读取它们。您需要在代理中进行一些缓冲,以避免消息碎片化,并且(特别是)避免其他客户端接收交错的两条消息。
  • 或者客户端发送两条消息,代理最终以reading 发送所有一条消息和一小部分第二条消息(然后第二次调用结束于其余消息)。
  • @MartinBonner:不知道我们在说什么套接字,你不能这么说。 UDP 不会分片。这是 UDP 固有的;因为它是无连接的,所以您无法连接来自两个 reads 的结果。所以read不允许对UDP数据包进行分片。
  • 完全不用线程,不用线程会轻松很多。
  • @MSalters - 哦,好收获!你说得对,我假设是 TCP 套接字。 (但是如果你使用 UDP,那么你会牺牲可靠性——这可能并不重要,特别是如果这是一个仅限 LAN 的应用程序)。

标签: c++ multithreading sockets mutex


【解决方案1】:

连接是双向的。一条路的内容不会覆盖另一条路的内容。这不需要互斥锁。

此外,您也不能使用互斥体,因为连接的两端是分开的。

【讨论】:

    猜你喜欢
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-01
    相关资源
    最近更新 更多