【问题标题】:How can I calculate the number of bytes in the packet payload?如何计算数据包有效负载中的字节数?
【发布时间】:2017-04-04 02:22:31
【问题描述】:

有一个客户端和一个服务器,在应用层,客户端正在向服务器发送具有随机负载大小的数据包。这意味着一个数据包可以是 1300 字节,下一个数据包可以是 450 字节,下一个数据包可以是 1449 字节,依此类推。在服务器上,您如何读取从客户端传入的有效负载数据?您的套接字应该读取多少数据?考虑到客户端无法发送它正在发送的有效负载大小的事实。服务器如何区分 1300、450 和 1449 字节的单个数据包。我们在 C 中使用 POSIX 套接字并在应用层工作。任何代码 sn-p 都会有所帮助。

【问题讨论】:

  • 你使用什么协议? IE。 socket 调用的参数是什么?
  • Any code snippet will be helpful 是的,没错,这将有助于我们理解您的问题 ;-) 说真的,请编辑问题,使其适合此处。
  • 这是用于 TCP 还是 UDP?我假设 TCP,考虑到“客户端无法发送它正在发送的有效负载大小”在 UDP 上不是问题,只有 TCP。为什么客户端无法发送有效负载大小?在 TCP 中,除非发送方发送有效载荷大小或唯一的消息分隔符,否则无法区分消息边界。消息负载实际上是什么样的?
  • 欢迎来到 Stack Overflow!请edit您的问题显示what you have tried so far。您应该包含您遇到问题的代码的minimal reproducible example,然后我们可以尝试帮助解决具体问题。您还应该阅读How to Ask

标签: c sockets


【解决方案1】:

一般来说,您只需发出一个recv(),其缓冲区大到足以容纳您期望的最大数据报。返回值将反映数据报的实际大小。

POSIX 没有指定检查下一个数据报大小的方法(除了读取它)。

但是,对于某些协议,Linux 和 BSD 系统可以;对于其他人,它将返回已接收到的可供读取的字节数。例如,如果您使用的是UDP socket,那么您可以使用FIONREAD ioctl()。这是一个例子:

#include <sys/socket.h>
#include <sys/ioctl.h>

size_t unread(const int socketfd)
{
    int length = 0;
    if (ioctl(socketfd, FIONREAD, &length))
        return 0;
    if (length < 0)
        return 0;
     return (size_t)length;
}

当然,这并不能真正告诉您是否有接收到的数据未决。一方面,它可能在ioctl() 之后到达。此外,还可以发送长度为零的数据报。上面的函数将在两者(未接收到数据报和接收到零长度数据报)以及错误(套接字协议不支持 ioctl)时返回零。

【讨论】:

    猜你喜欢
    • 2019-05-31
    • 2022-12-18
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    • 2011-04-28
    • 2011-09-30
    相关资源
    最近更新 更多