从带有MSG_PEEK标志的偏移处的套接字读取

Reading from a socket at an offset with MSG_PEEK flag?

本文关键字:套接字 读取 标志 MSG PEEK      更新时间:2023-10-16

我想摆脱从套接字读取的顺序和缓慢的方式,我们在其中使用:

struct PACKET_STRUCT{
   int PacketType;
   char buffer[50];
};
char buffer[sizeof(PACKET_STRUCT)];
struct sockaddr_storage addr;
socklen_t fromlen = sizeof(addr);
int iByteCount = recvfrom(CProperties->m_iSocket, buffer, sizeof (buffer), MSG_PEEK, (struct sockaddr*)&addr, &fromlen);

这意味着,如果客户端向我发送PACKET_STRUCT(数据包#1)和另一个PACKET_STRUCT(数据包#2),那么在我能够从数据包#2读取之前,我必须读取数据包#1。

有没有一种方法可以让我在recvfrom中偏移,从(PACKET_STRUCT)的大小开始,这样我就可以在不读取数据包#1的情况下读取数据包#2?

依此类推sizeof(PACKET_STRUCT)*2以读取数据包#3。

我知道有一个pread()允许在某个偏移量读取文件描述符,但我想保留MSG_PEEK标志。

还有一个lseek()函数可以设置文件描述符的位置,但我将让几个工作线程读取该文件描述符(我不希望使用互斥,因为这也是顺序的。)

所以我的问题是,是否有类似recvmsg的函数带有偏移和MSG_PEEK标志?

没有在套接字上查找或跳过数据的概念,所以不能这样做。(lseek/read不能在套接字上使用)

有些平台允许您使用recvmmsg在一次调用中接收多个数据报,如果您不关心第一条消息,只需接收并忽略它