2013-11-21 20 views
0

我想从从一个socket读取,在此我们使用顺序和缓慢的方式离开:从带有MSG_PEEK标志的偏移处读取套接字?

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) - 我必须先阅读Packet#1,然后才能从Packet#2中读取数据。

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

等sizeof(PACKET_STRUCT)* 2来读取数据包#3。

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

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

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

回答

0

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

一些平台,让您在一个电话收到许多数据包,虽然使用recvmmsg,如果你不关心的第一个消息 - 刚刚接收和忽略它。

+0

真的很棒!看作非阻塞recvmmsg()立即返回,但也返回发送的消息数量。然后,我将能够让工作人员通过mmsghdr结构进行挖掘。 – Lucky

+0

但看到recvmmsg()是recvmsg()的扩展。使用recvmsg()并不相同,然后发送一个工作人员去处理该缓冲区?或者,使用recvmmsg()会带来更多的速度优势,具体取决于我们如何优化它? – Lucky

+0

@Lucky因为你可以在一个系统调用中读取很多消息,所以你可以避免进行大量的系统调用 - 这可能是一个巨大的胜利。如果你再组织你的工作人员,那么你可以一次把许多数据包交给他们,这在使用recvmmsg()时可能更容易,你也可以从中受益(例如缓冲消息并让工作人员一次处理几个数据包创造更少的开销)。这假设你正在使用UDP。对于TCP,您每次都会读取大量缓冲区,并解析出所有已读完的消息,并处理这些消息 - 不要尝试一次读取一个小“消息” – nos