Я хочу уйти от последовательного и медленного способа чтения из сокета, в котором мы используем:
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?
Нет концепции поиска или пропуска данных в сокете, поэтому вы не можете этого сделать. (lseek / pread не может использоваться на сокетах)
Некоторые платформы позволяют получать много дейтаграмм за один звонок, используя recvmmsg, если вас не волнует первое сообщение — просто примите и проигнорируйте его.
Других решений пока нет …