gpt4 book ai didi

c++ - 有什么方法可以知道在发送之前将在 TCP 上发送多少字节?

转载 作者:行者123 更新时间:2023-12-05 04:34:33 24 4
gpt4 key购买 nike

我知道 Linux TCP 服务器中的 ::send 可以限制有效负载的发送,因此需要多次调用 ::send 直到发送整个有效负载。

即有效载荷为1024字节

sent_bytes =::send(fd, ...) 其中 sent_bytes 只有 256 字节,因此需要再次调用。

有没有办法在发送前准确知道可以发送多少字节?如果套接字将允许整个消息,或者消息将被碎片化,碎片是多少?

示例案例

2 条消息由不同的线程在同一个 tcp 客户端上同时通过 ::send() 发送到同一个套接字。在某些消息很大的情况下,需要多次调用 ::send(),因为并非所有字节都在初始调用时发送。因此,继续循环解决方案,直到发送完所有字节。该循环是互斥的,因此可以看作是线程安全的,因此每个线程都必须在另一个线程之后执行发送。但是,我担心的是,因为 Tcp 是一个流,客户端将收到每条消息的片段,我想如果我知道一次发送多少字节,我可以在客户端重建消息.

尽管对 ::send() 的调用是按顺序完成的,但字节流是否仍然是混合的?

实际上,这是否会发生:

  • 服务器端
    • 消息 1:“CiaoCiao”​​
    • 消息 2:“HelloThere”
  • 客户端
    • 收到消息:“CiaoHelloCiaoThere”

最佳答案

Although the call to ::send() is done sequentially, is the any chance thatthe byte stream is still mixed?

当然。不仅有这样的机会,而且在某一时刻几乎是确定无疑的。它会在某一时刻发生。保证。

sent to the same socket by different threads

有必要在此级别处理同步,方法是使用互斥锁,每个线程在发送其消息之前锁定该互斥锁,并仅在发送整个消息后解锁它。

无需发送,这会留下一个可能性,即阻塞/挂起的套接字将导致单个线程锁定此互斥量过长的时间,直到套接字超时并且您的执行线程结束处理失败send()write(),以任何它现在已经在做的方式(当然,您正在检查发送/写入的返回值,并处理异常适当的条件)。

没有单一的、千篇一律的、按数字绘制的、适用于所有情况、每个程序的解决方案,需要做这样的事情。每个最终解决方案都需要根据每个项目的独特要求和目的进行定制。只有一种可能性是处理所有套接字输入/输出的专用执行线程,以及所有其他执行线程将它们的消息发送到套接字线程,而不是直接写入套接字。这将避免所有 执行线程被挂起的套接字楔入,以增加内存为代价,它保存所有未发送的数据。

但这只是一种可能的方法。可能的替代解决方案的数量没有限制。您需要确定哪种基于逻辑/算法的解决方案最适合您的特定程序。对于套接字上的 send()write() 调用的数量,没有操作系统/内核级别指示可以为您提供任何类型的保证接受。

关于c++ - 有什么方法可以知道在发送之前将在 TCP 上发送多少字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71199777/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com