我正在尝试计算程序中的发送字节总数,但是我无法获得准确的值。 我所有的函数都调用一个函数,该函数使用send()函数将数据发送到服务器。 在此函数中,我得到send()的返回并将总和计入全局计数器。一切正常。 但是,当我与“ iftop”实用程序(sudo iftop -f“端口33755”)进行比较时,我在iftop上然后在我的应用程序中得到了更多数据....我的猜测是由于tcp标头/协议数据。我真的不知道该怎么计算。我正在使用send()和可变数据长度发送数据包,所以我不确定是否可以从那里检测/计算TCP数据包大小。我知道每个TCP数据包都会发送TCP标头,但是我不确定要发送多少个数据包。 我是否可以假设每次对send()的调用(如果数据长度小于1518(TCP数据包大小限制?))都小于一个TCP数据包,并且我需要对TCP报头长度求和?即使我发送了一个字节?如果是这样,TCP结构中这些多余的字节是多少?!
有关信息:我正在Linux上使用GCC作为编译器。
谢谢!
答案 0 :(得分:0)
如何使用C语言中的send()计数字节,包括协议大小?
在您的程序中没有可靠的方法来执行此操作。您可以计算出传输总计数为有效载荷大小的数据所需的最低总字节数,但要遵循一些假设,但是您需要从内核端进行监视以确定确切的字节数。字节。
如果数据长度小于,我可以假设每次调用send() 1518(TCP数据包大小有限制吗?),它是一个TCP数据包,而我 需要总结TCP报头长度?
不,那不是一个安全的假设。主要问题是内核不一定将每个send()
调用传输的数据与其自己的数据包序列进行匹配。它可以将来自多个send()
的数据组合到较少的数据包中。但是,此外,它可能会使用比以太网默认值1500字节小的MTU或更大的MTU,具体取决于各种因素,此外,您还需要将数据包头放入所选的MTU中,因此一个数据包携带的有效负载为小于那个。
我怀疑您太难了。如果这是已分配给您的任务(例如,一个家庭作业问题),那么我的第一个猜测是打算仅计算总有效负载大小,而不计算协议开销。另外,如果您确实需要考虑开销,那么我的猜测是,应该根据网络的测量或假定特征来估算。如果您自己解决了这个问题,那么我只能说人们通常会进行我刚才描述的两种计算之一,而不是您所要求的。