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