gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:53:50 25 4
gpt4 key购买 nike

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

最佳答案

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

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

但是,对于某些协议(protocol),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() 之后到达。此外,还可以发送零长度数据报。上述函数将在两种情况(未收到数据报和收到零长度数据报)以及错误(套接字协议(protocol)不支持 ioctl)时返回零。

关于c - 如何计算数据包有效负载中的字节数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40707479/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com