计算从客户端发送到服务器的数据包数量?

时间:2009-02-25 16:41:24

标签: c++ winapi sockets winsock winsockets

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

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

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

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

提前致谢:)

3 个答案:

答案 0 :(得分:1)

这真的归结为'包'的意思。

正如您可能知道的那样,当在线路上发送TCP / UDP消息时,正在发送的数据被“包装”或预先附加相应的TCP / UDP报头。然后将其“包装”在IP标头中,然后将其“包裹”在以太网帧中。如果你使用像Wireshark这样的嗅探包,你可以看到这个突破。

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

你可以通过添加自己的标题长度和计数器来做别人的建议。此信息将帮助您准确调整接收缓冲区的大小,但它无法帮助您确定数据包的数量(同样,IP ...),尤其是在您正在执行TCP时。

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

答案 1 :(得分:0)

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

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

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

也许使用UDP,你也可以将你的传输拆分成具有propper sequence-id的固定大小的块。在排序之前,您必须累积所有传入的包(UDP不保证接收顺序)并将数据粘贴在一起。

另一方面,如果你真的有必要支持UDP,你应该考虑一下,因为如果你想让这个协议安全错误的话会有一些手动开销...(参见Wikipedia Article on TCP了解一下要解决的问题列表)

答案 2 :(得分:0)

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