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

i、 有效载荷为1024字节

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

有没有办法知道在发送之前可以发送多少字节?如果套接字将允许整个消息,或者消息将被碎片化,以及碎片化的程度如何?

Example Case

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

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

实际上,这种情况会发生吗:

  • 服务器端
  • 客户端

推荐答案

虽然对::send()的调用是按顺序完成的,但是

当然这不仅是有可能的,而且在某个时刻几乎是肯定的.它会在某个时刻发生.放心.

由不同线程发送到同一套接字

有必要在这个级别处理同步,方法是使用互斥锁,每个线程在发送消息之前锁定该互斥锁,只有在发送整个消息之后才解锁该互斥锁.

不用发送,这就留下了一种可能性,即阻塞/挂起的套接字将导致单个线程将此互斥锁锁定过多时间,直到套接字超时,并且您的执行线程最终处理失败的send()write(),无论它现在以何种方式(当然,您正在判断send/write的返回值,并适当地处理异常条件).

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

但这只是一种可能的方法.可能的替代解决方案的数量没有限制.你需要找出哪个基于逻辑/算法的解决方案最适合你的特定程序.没有操作系统/内核级别的指示可以保证套接字上的send()write()调用可以接受多少.

Linux相关问答推荐

无法在Raspberry PI 3 Model B上分配256TB的虚拟内存

boost-iostreams 1.59 sparc-solaris 交叉编译失败

如何在Linux下使用正则表达式更改文件名

sed + 从没有额外空格的文本中删除单词

SessionNotCreatedException:无法启动新会话.响应代码 500 在远程服务器上的 Apache Tomcat/10.0.23 上使用 ChromeDriver

8 个半小时范围的 Crontab 表达式

获取S3路径的linux命令

Bash 更新 yaml 文件中的图像值

Linux 如何将主机文件作为用户的输入并将其调用到脚本中

Bash - 如何根据 names.txt 重命名目录中的文件

如何忽略 diff 命令中的一些差异?

Linux批量转换:使用转换更改jpg的质量但保留其名称

从Linux中的行尾删除空格

给定一个 linux 用户名和密码,我如何测试它是否是有效帐户?

/var 中有什么?

后缀 - status=bounced(未知用户myuser)

查找和基本名称不能很好地播放

当我已经 ssh 进入远程机器时,如何 scp 回到本地?

将 BlueZ Stack 用作外设(广告商)

在我的 index.php 中加载 CSS 和 JS 等资源时出现错误 403