1

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

发送的数据可以是可变长度的,所以我不能只将接收到的总字节数除以#define'd 值。

我们必须使用异步调用来做所有事情,所以我一直在尝试用我为服务器套接字获得的每条 FD_READ 消息增加一个计数器。但是,因为我必须能够接受可能很大的文件大小,所以我必须使用大约 64k 的缓冲区大小调用 recv/recvfrom。如果我发送一个小数据包(az),则没有问题。但是,如果我发送 1024 个字符的字符串 10 倍,服务器会报告收到 2 或 3 个数据包,但就发送/接收的字节而言,数据丢失率为 0%。

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

提前致谢 :)

4

3 回答 3

1

这真的归结为你所说的“数据包”。

您可能知道,当通过网络发送 TCP/UDP 消息时,发送的数据会被“包装”或附加在相应的 TCP/UDP 标头中。然后将其“包装”在 IP 标头中,该标头又“包装”在以太网帧中。如果你使用像 Wireshark 这样的嗅探包,你可以看到这个突破。

重点是这个。当我听到“数据包”这个词时,我会想到 IP 级别的数据。IP 数据是真正在线上打包的,因此在谈论 IP 时,数据包计数是有意义的。但是,如果您使用常规套接字来发送和接收数据,那么 IP 标头以及 TCP/UDP 标头将被剥离,也就是说,您不会从套接字中获取此信息。如果没有这些信息,就不可能确定传输的“数据包”(再次,我认为是 IP)的数量。

您可以通过添加您自己的带有长度和计数器的标题来执行其他人的建议。此信息将帮助您准确地确定接收缓冲区的大小,但它不会帮助您确定数据包的数量(同样,IP...),尤其是在您使用 TCP 时。

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

于 2009-02-25T20:06:23.907 回答
0

不是对您的问题的直接回答,而是对不同解决方案的建议。

如果您在要传输的数据前面发送一个长度描述符怎么办?这样您就可以在客户端上分配正确的缓冲区大小(不要太多,也不要太少),并检查传输结束时是否有任何损失。

使用 TCP,您应该完全没有问题,因为协议本身处理无错误传输,否则您应该得到一个有意义的错误。

也许使用 UDP,您还可以将传输拆分为具有适当序列 ID 的固定大小的块。在对它们进行排序之前,您必须累积所有传入的包(UDP 不保证接收顺序)并将数据粘贴在一起。

另一方面,如果真的有必要支持 UDP,你应该考虑一下,因为如果你想获得该协议的错误安全,那么会有相当多的手动开销......(有关问题列表,请参阅关于 TCP 的维基百科文章绕过)

于 2009-02-25T17:46:22.527 回答
0

您的数据包是否具有固定的标头,或者您是否可以定义自己的标头。如果您可以自己定义,请在标头中包含一个数据包计数器以及长度。您必须在计数器中保留一个计算翻转的运行总数,但这将确保您计算发送的数据包,而不是接收的数据包。对于一个简单的分配,您可能不会遇到丢失(显然是使用 UDP),但如果是这样,数据包计数器将确保您的统计信息准确地反映发送的消息。

于 2009-02-25T18:35:37.213 回答