当前位置: 首页 > 知识库问答 >
问题:

Windows/Winsock UDP数据包被组合在一起?

山乐生
2023-03-14

我有一个 C 和 C 的测试应用程序,其中客户端不断用服务器发送的最后一个数字轰炸服务器,当服务器收到这些数据包之一时,它会增加一次数字,然后将新数字发送到客户端,发生的事情是客户端始终是客户端和服务器运行的本地机器上的服务器后面的 1 个数字, 这完全是意料之中的。

当 recvfrom 和 sendto 期望并发送 9328 字节数据包时,这很好,但是当我将数据包的大小降至 256 时,客户端总是 33 个计数不同步,当客户端发送 44 字节数据包并且服务器需要 256 字节时,客户端总是 212 个计数不同步, 每次都在同一台机器上无故障。

我使用LAN IP地址发送这些数据包,客户端和服务器分别通过端口3000和2000在同一台机器上侦听。

客户端以最快的速度向服务器发送数据包。服务器只会在收到数据包时向客户端发送更新的计数。

有趣的是,当我关闭客户端时,服务器仍在处理客户端发送的数据包,所以我猜这是一种操作系统轰炸保护,或者是Windows将许多小UDP数据包组合成一个9328字节的UDP数据。

如何发送

共有1个答案

林子石
2023-03-14

这3行将通过将包缓冲区的大小设置为零来禁用包缓冲区。

const int size = 0;
setsockopt( sd, SOL_SOCKET, SO_SNDBUF, ( const char * )&size, sizeof( int ) );
setsockopt( sd, SOL_SOCKET, SO_RCVBUF, ( const char * )&size, sizeof( int ) );

请记住,这样做意味着数据包在收到后不会被存储,因此如果接收端没有足够频繁地监听数据包,数据包更有可能被遗漏。

 类似资料:
  • 在正确配置日志保留期后,kafka主题数据不会在windows中被删除。 以下错误记录在Kafka服务器日志中。 原因:java.nio.file.文件系统异常: \tmp\kafka-logs\TopicName-2\0000000000000007262.log - 计划任务“Kafka日志保留”(Kafka.utils.Kafka调度程序)中未捕获的异常

  • 问题内容: 有没有一种快速的方法来将一个数组的值组合为另一个数组的键? 输入: 预期产量: 我该怎么办? 问题答案: 会完全按照您的意愿做。 引用手册: 通过将keys数组中的值用作键,并将values数组中的值用作对应值来创建数组。 对于您的情况,您必须执行以下操作: 当然,您也可以使用各种循环组合来做到这一点,这可能是最简单的解决方案。

  • (更新) 看来我的问题表达得不够清楚。我的问题不是如何解析数据,如果它被分割成多个段。我的协议定义得很好(即START_COOKIE、LENGTH、DATA、CRC),并且我一收到数据就将其排入字节FIFO(上面代码段中的调用),因此我可以轻松地对其进行异步解析。 问题是,如果我看到的是第号包。1(100字节)(在Wireshark中+50ms)和数据包编号。2(100字节)在Wireshark中

  • 我有一个java POJO 我有一个火花 我的数据集有一个值列表,但有重复的Ids。如何组合重复的帐户Ids并使用Spark group pBy将Key值对聚合到一个Map中。谢谢你的帮助。 所以我有: 我需要这个:

  • 问题内容: 使用Python嗅探网络数据包的最佳方法是什么? 我从几个地方听说,最好的模块是一个名为Scapy的模块,不幸的是,它使python.exe在我的系统上崩溃。我认为这只是我的安装方式的问题,除了许多其他人告诉我,它在Windows上不能很好地工作。(如果有人感兴趣,我正在运行WindowsVista,这可能会影响某些事情)。 有谁知道更好的解决方案? UPD: 阅读了告诉我要安装PyP

  • 问题内容: 我正在尝试将以下两个数组合并为一个共享相同密钥的数组: 第一个数组: 第二个数组: 如您所见,它们共享相同的密钥(Camera1,Camera2,Camera3等。) 这是我尝试过的: 问题答案: 理想情况下,我希望以一种方式格式化两个数组,从而简单地合并两个数组而不必大惊小怪。 但是我确实提出了一个使用过的解决方案。 输出为: