【发布时间】:2013-11-21 23:07:49
【问题描述】:
我想摆脱从我们使用的套接字读取的顺序和缓慢的方式:
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)——我必须先读取数据包 #1,然后才能读取数据包 #2。
有没有一种方法可以让我在 recvfrom 中进行偏移,从 sizeof(PACKET_STRUCT) 开始,这样我就可以在不读取 Packet #1 的情况下读取 Packet #2?
依此类推 sizeof(PACKET_STRUCT)*2 读取数据包 #3。
我知道有一个 pread() 允许读取某个偏移量的文件描述符,但我想保留 MSG_PEEK 标志。
还有一个 lseek() 函数可以设置文件描述符的位置,但我将有几个工作线程读取该文件描述符(我不希望使用互斥锁,因为这也是顺序的。)
所以我的问题是,是否有一个带有偏移量和 MSG_PEEK 标志的类似 recvmsg 的函数?
【问题讨论】:
标签: c++ sockets networking udp bsd