Я хочу уйти от последовательного и медленного чтения из сокета, в котором мы используем:
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), чтобы я мог читать пакет №2, не читая пакет №1?
И так далее sizeof(PACKET_STRUCT)*2 для чтения пакета #3.
Я понимаю, что существует pread(), который позволяет читать дескриптор файла с определенным смещением, но я хотел бы сохранить флаг MSG_PEEK.
Существует также функция lseek(), которая устанавливает позицию файлового дескриптора, но у меня будет несколько рабочих потоков, читающих этот файловый дескриптор (и я бы предпочел не использовать мьютекс, поскольку он также является последовательным).
Итак, мой вопрос: существует ли recvmsg-подобная функция со смещением и флагами MSG_PEEK?