因此,我几乎完成了涉及Win32编程和套接字的任务,但是我必须生成并分析有关传输的一些统计信息。我唯一遇到麻烦的部分是如何计算从客户端发送到服务器的数据包数量。

发送的数据可以是可变长度的,因此我不能仅将接收到的总字节除以#define的值。

我们必须使用异步调用来完成所有操作,因此我一直在尝试为服务器套接字获取的每个FD_READ消息都增加一个计数器。但是,由于我必须能够接受可能较大的文件大小,因此必须使用大约64k的缓冲区大小来调用recv/recvfrom。如果我发送一个小数据包(a-z),则没有问题。但是,如果我发送一个1024个字符的字符串10x,则服务器报告接收到2或3个数据包,但是就发送/接收的字节而言,数据丢失率为0%。

知道如何获取数据包数量吗?

提前致谢 :)

最佳答案

这实际上可以归结为您所说的“数据包”。

您可能已经知道,在网络上发送TCP/UDP消息时,将使用相应的TCP/UDP header 对“发送”的数据进行“包装”或添加前缀。然后将其“包装”在IP header 中,然后将其“包装”在以太网帧中。如果使用Wireshark之​​类的嗅探包,则可以看到此突破。

关键是这个。当我听到“数据包”一词时,我想到的是IP级别的数据。 IP数据确实是在网络上打包的,因此在谈论IP时,数据包计数是有意义的。但是,如果您使用常规套接字发送和接收数据,则会剥夺IP header 以及TCP/UDP header ,即,您不会从套接字获取此信息。没有这些信息,就无法确定已传输的“数据包”(同样是我在考虑IP)的数量。

您可以通过添加自己的带有长度和计数器的 header 来完成其他建议。此信息将帮助您准确地确定接收缓冲区的大小,但不会帮助您确定数据包的数量(再次是IP ...),尤其是在执行TCP的情况下。

如果您想使用Winsock套接字准确地确定数据包的数量,我建议按照建议的here创建一个“原始”套接字。该套接字将收集本地NIC看到的所有IP通信。使用IP和TCP/UDP header 可根据客户端和服务器套接字(即IP地址和端口号)过滤数据。这将准确显示实际使用了多少IP数据包来传输数据。

09-04 03:08
查看更多