c - 如何在 C 中使用 send() 计算字节数,包括协议(protocol)大小?

标签 c sockets

我正在尝试计算程序中的总发送字节数,但无法获得准确的值。 我的所有函数都调用一个函数,该函数使用 send() 函数将数据发送到我的服务器。 在此函数中,我得到 send() 的返回并将总和放入全局计数器中。这工作正常。 但是,当我与“iftop”实用程序(sudo iftop -f“端口 33755”)进行比较时,我在 iftop 上获得了更多数据,然后在我的应用程序中......以及我的猜测是因为 tcp header /协议(protocol)数据。我真的不知道如何计算这个。我使用 send() 和可变数据长度发送数据包,因此我不确定是否可以从那里检测/计算 TCP 数据包大小。我知道每个TCP数据包都会发送TCP header ,但我不确定发送了多少个数据包。 我是否可以假设每次调用 send() 时,如果数据长度小于 1518(TCP 数据包大小限制?),那么它只有一个 TCP 数据包,并且我需要对 TCP header 长度求和?即使我发送了一个字节?如果是这样,这些来自 TCP 结构的额外字节有多少?!

引用信息:我在 Linux 上使用 GCC 作为编译器。

谢谢!

最佳答案

How to count bytes using send() in C, including protocol size?

在您的程序中没有可靠的方法可以做到这一点。您可以计算传输您计算的总有效负载大小的数据所需的最小总字节数,但需要进行一些假设,但您需要从内核端进行监视以确定确切的字节数字节。

May I assume that every call to send(), if data length is less than 1518 (TCP packet size limite?), than it's only one TCP packet and I need to sum TCP Header length?

不,这不是一个安全的假设。主要问题是内核不一定将每个 send() 调用传输的数据与其自己的数据包序列相匹配。它可以将来自多个 send() 的数据组合成较少数量的数据包。然而,此外,它可能会使用比以太网默认的 1500 字节更小的 MTU 或更大的 MTU,具体取决于各种因素,此外,您需要将数据包 header 放入所选的 MTU 中,因此一个数据包携带的有效负载为比那个小。

我怀疑你把这件事搞得太难了。如果这是分配给您的任务(例如家庭作业问题),那么我的第一个猜测是您只计算总有效负载大小,而不计算协议(protocol)开销。或者,如果您确实需要考虑开销,那么我的猜测是您应该根据测量或假设的网络特征进行估计。如果你给自己设置了这个问题,那么我只能说人们通常会进行我刚才描述的两种计算之一,而不是你问的那个。

关于c - 如何在 C 中使用 send() 计算字节数,包括协议(protocol)大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55123933/

相关文章:

c++ - bind() 可以将 IPTABLES 中配置的端口作为转发端口

python - 在运行的进程中刷新paramiko中的stdout

c++ - Qt Creator 未定义套接字 - Linux

c - 按 ENTER 继续(Linux 和 C)

c - C 中用 Last 覆盖的数组元素

c - 如何从 c 文件中读取特定数据列

visual-studio-2010 - 将类从 MFC 移植到 C++ 控制台应用程序。使用/MD[d](CRT dll版本)构建MFC应用程序需要

c - 在 C 中使用 va_arg() 时如何避免运行时错误

c - 为什么将此 double 转换为 int 会得到 0?

c - 套接字编程