从具有MSG_PEEK标志的偏移量的套接字读取?

时间:2013-11-21 23:07:50

标签: 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, buffer, sizeof (buffer), MSG_PEEK, (struct sockaddr*)&addr, &fromlen);

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

有没有一种方法可以在recvfrom中进行偏移,从sizeof(PACKET_STRUCT)开始,我可以在不读取数据包#1的情况下读取数据包#2?

等尺寸(PACKET_STRUCT)* 2读取数据包#3。

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

还有一个lseek()函数设置文件描述符的位置,但是我将在该文件描述符上读取几个工作线程(我宁愿不使用互斥锁,因为它也是顺序的。)

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

1 个答案:

答案 0 :(得分:0)

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

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