Чтение из сокета со смещением с флагом MSG_PEEK?

0

Я хочу уйти от последовательного и медленного чтения из сокета, в котором мы используем:

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?

Теги:
networking
sockets
udp
bsd

1 ответ

0
Лучший ответ

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

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

  • 0
    Действительно здорово! Видя, что неблокирующая функция recvmmsg () возвращает сразу, но также возвращает количество отправленных сообщений. Тогда я смогу заставить моих работников работать через эту структуру mmsghdr.
  • 0
    Но видение как recvmmsg () является расширением recvmsg (). Разве это не то же самое, что использовать recvmsg () и затем отправить работника для работы в этом буфере? Или есть ли другие преимущества от использования recvmmsg () в зависимости от того, как мы его оптимизируем?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню