я могу считать точно один пакет UDP от сокета?

Используя API сокета UNIX на Linux, там какой-либо способ гарантировать, что я считал один пакет UDP и только один пакет UDP? Я в настоящее время читаю пакеты от не блокирующегося сокета с помощью recvmsg с размером буфера, немного больше, чем MTU нашей внутренней сети. Это должно гарантировать, что я могу всегда получать полный пакет UDP, но я не уверен, что могу гарантировать, что я никогда не буду получать больше чем один пакет на вызов recvmsg, если пакеты будут небольшими.

recvmsg страницы справочника ссылаются на опцию MESSAGE_WAITALL, которая пытается ожидать, пока буфер не заполнен. Мы не используем это, который подразумевает, что recvmsg будет всегда возвращаться после того, как одна датаграмма читается? Там какой-либо путь состоит в том, чтобы гарантировать это?

Идеально я хотел бы решение перекрестного UNIX, но если это не существует, там что-то конкретный Linux?

8
задан Brian Palmer 30 March 2010 в 18:21
поделиться

2 ответа

recvmsg вернет вам один пакет, и это будет весь пакет (при условии, что предоставленный вами буфер достаточно велик).

Из документации POSIX :

Функция recvmsg () должна получать сообщение от сокета в режиме соединения или без соединения.

«сообщение» означает ровно одно сообщение (или пакет), и,

для сокетов на основе сообщений, таких как SOCK_DGRAM и SOCK_SEQPACKET, все сообщение должно быть прочитано за одну операцию.

13
ответ дан 5 December 2019 в 12:57
поделиться

Один из вариантов (я говорю вариант) - использовать pcap_next с помощью libpcap и разобрать его, чтобы проверить, является ли он пакетом udp. Вы можете сделать это с помощью:

/* jump pass the ethernet header */
ipdata = (struct ip*)(packet + sizeof(struct ether_header));
length -= sizeof(struct ether_header);

(Заимствовано из tcpdump)

, а затем проверить структуру ip, чтобы убедиться, что это пакет udp, выполнив:

if ( ipdata->ip_p == IPPROTO_UDP )

И если это не удается, продолжайте цикл (вызывая pcap_next), пока вы получите свой udp-пакет. Конечно, извлечение дейтаграммы udp таким способом сложнее, но он позволяет вам довольно хорошо проникнуть во внутреннее устройство пакета. Обратитесь к источнику tcpdump, чтобы узнать, как удалить информацию и что получится.

0
ответ дан 5 December 2019 в 12:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: