Чтение из сокета со смещением с флагом 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) — мне нужно будет прочитать Пакет № 1, прежде чем я смогу читать из Пакета № 2.

Есть ли способ, где я могу сместить в recvfrom, начиная с размера (PACKET_STRUCT), в котором я мог бы прочитать Пакет № 2 без чтения Пакет № 1?

И так далее sizeof (PACKET_STRUCT) * 2 для чтения Пакета № 3.

Я понимаю, что есть pread (), который позволяет читать дескриптор файла с определенным смещением, но я бы хотел оставить флаг MSG_PEEK.

Существует также функция lseek (), которая устанавливает позицию файлового дескриптора, но у меня будет несколько рабочих потоков, читающих этот файловый дескриптор (и я бы предпочел не использовать мьютекс, поскольку он также является последовательным).

Итак, мой вопрос, есть ли функция, похожая на recvmsg, со смещением и флагами MSG_PEEK?

0

Решение

Нет концепции поиска или пропуска данных в сокете, поэтому вы не можете этого сделать. (lseek / pread не может использоваться на сокетах)

Некоторые платформы позволяют получать много дейтаграмм за один звонок, используя recvmmsg, если вас не волнует первое сообщение — просто примите и проигнорируйте его.

0

Другие решения

Других решений пока нет …