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