C++ 从带有MSG_PEEK标志的偏移处的插槽读取?

C++ 从带有MSG_PEEK标志的偏移处的插槽读取?,c++,sockets,networking,udp,bsd,C++,Sockets,Networking,Udp,Bsd,我想摆脱从套接字读取数据的顺序和缓慢方式,在这种方式中,我们使用: 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

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

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);
这意味着,如果客户端向我发送数据包结构(数据包1)和另一个数据包结构(数据包2)——我必须先读取数据包1,然后才能读取数据包2

是否有一种方法可以在recvfrom中进行偏移,从sizeof(PACKET#u STRUCT)开始,在这种方法中我可以读取PACKET#2而不读取PACKET#1

依此类推sizeof(PACKET#STRUCT)*2以读取PACKET#3

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

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


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

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


但是,有些平台允许您在一次呼叫中接收多个数据报,如果您不关心第一条消息,请使用接收并忽略它。

真是太棒了!seing as non-blocking recvmmsg()立即返回,但也返回发送的消息数。然后我就可以让工人通过mmsghdr结构来挖掘。但是,看到recvmmsg()是recvmsg()的扩展。使用recvmsg()然后发送一个worker到该缓冲区上工作不是一样吗?或者,使用recvmmsg()是否有更多的速度优势取决于我们如何优化它?@Lucky由于您可以在一个系统调用中读取多条消息,因此可以避免执行大量系统调用,这可能是一个巨大的胜利。然后,如果您对工作人员进行结构化,以便一次可以将多个数据包传递给他们,这在使用recvmmsg()时可能会更容易,您也会从中受益(因为缓冲消息并让工作人员一次性处理多个数据包会减少开销)。这是假设您正在使用UDP。对于TCP,您每次都会读取一个大的缓冲区,解析出所有已读取的完整消息,并对其进行处理—不要试图一次读取一条小“消息”