数据包在定期发送时是堆叠的
Packets Are Stacked When Sent at Regular Intervals
本文关键字:数据包 更新时间:2023-10-16
我正试图以固定的间隔(每秒)通过TCP套接字发送消息。有时不会发送完整的消息,或者将两到四条消息堆叠在一起同时发送。如果返回值是0或者<0,但这些都不是真的。我尝试了一种显而易见的方法,即检查send()的确切返回值,看看发送的字节是少还是多。它只返回我在参数中指定的要发送的数字(如果发送块直到它发送那么多,这是有意义的),即使发送的字节更少。那么,有没有一种准确的方法来说明"发送的数据包大小是否合适?"没有?——做点什么"?
TCP提供可靠的流字节,没有消息边界。如果你需要知道消息的长度,你必须将其构建到协议中,例如:发送每个消息带有一个2字节的头,指定消息长度。
TCP没有这样的功能。如何将TCP 流分割成数据包取决于内核内网络堆栈。您可以在套接字上设置 TCP_NODELAY
选项来禁用Nagle算法
如果我没理解错的话,有时你发送两个或多个数据包,但它们在远端被当作一个接收。
这是TCP/IP的本质。您不能保证数据包到达时是不同的,只能保证它们按顺序可靠地到达。
不确定你正在使用什么平台或你正在使用什么语法(流,FILE
对象或文件描述符;一些代码会澄清这一点),但是您可能需要在编写每个消息之后执行显式的flush
操作来强制内核。我通常使用c风格的文件描述符,通常在描述符上调用fflush
就足以使我排队的任何东西立即出去。
相关文章:
- boost::asio UDP 广播客户端仅接收"fast"数据包
- 如何使用发送数据包所花费的时间计算两个节点之间的距离?
- 发送固定大小的 UDP 数据包
- pcap_handler回调仅在使用 NPCAP v0.9991 时包含空数据包
- 在 c++ 中解析数据包数据的最佳方法是什么?
- 接受函数在发送数据包时等待
- 如何在 omnet++ 中发送自定义数据包?
- 数据包访问实践
- 在C++中创建一个简单的数据包路由器,如何跟踪"客户端"?
- 德拉吉诺 LG01-S 收到异常数据包并停止工作
- 将数据包从C++服务器发送到NodeJs服务器时出现MessagePack解码错误
- 使用C++将UDP数据包存储在Structure中
- FFmpeg av_read_frame从音频流返回数据包
- 为什么操作系统正在更改我的数据包的指定传出端口
- 是否可以将多个结构作为一个数据包存储在一个函数中,然后传递给其他函数并在那里提取?
- recvfrom 只收到几个数据包,之后它进入等待状态
- 如何调试由 C++ 编写的 npm 数据包
- 如何在INET的应用层中发送广播数据包
- C++ 将字符串数据包转换为 iphdr语言 - 字符串数据包的格式应该是什么?
- 不同的数据包,联合 - 正确的用法\验证?