我想摆脱从套接字读取的顺序和缓慢的方式,我们在其中使用:
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类似函数?
答案 0 :(得分:0)
没有在套接字上寻找或跳过数据的概念,所以你不能这样做。 (lseek / pread不能在套接字上使用)
有些平台允许您在一次通话中收到许多数据报,但如果您不关心第一条消息,请使用recvmmsg - 只需接收并忽略它。