2009-02-25 26 views
1

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

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

我们必须使用异步调用做的一切,所以我一直在试图增加每FD_READ消息,我得到了服务器的套接字的计数器。但是,因为我必须能够接受可能较大的文件大小,所以我必须调用recv/recvfrom,缓冲区大小为64k左右。如果我发送一个小包(a-z),就没有问题。但是,如果我发送一个1024个字符的字符串10x,则服务器会报告收到的2或3个数据包,但发送/接收的字节数据丢失为0%。

任何想法如何获得数据包的数量?

感谢提前:)

+0

我假定这是一个流套接字(即TCP),而不是一个数据报套接字(即UDP)? ...问题是你正在接收流片段而不是数据包。 – 2009-02-25 16:56:06

+0

我们实际上必须实现TCP和UDP。我不太清楚你的流片段是什么意思,但是数据全部被读取 - 它只是被排队等待直到我调用recv/recvfrom,然后它尽可能多地抓取它。我需要围绕这个来计算。 – David 2009-02-25 17:05:57

回答

0

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

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

使用TCP你应该没有问题,因为在所有的协议本身处理无差错传输或以其他方式,你应该得到一个有意义的错误。

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

另一方面,如果真的需要支持UDP,你应该考虑一下,因为如果你想让该协议安全无误,那么会有一些手动开销......(请参阅Wikipedia Article on TCP获取需要解决的问题)

0

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

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数据包传输数据。

相关问题