如何计算数据包有效负载中的字节数?

时间:2016-11-20 18:02:08

标签: c sockets

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

1 个答案:

答案 0 :(得分:0)

通常,您只需发出一个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)。