2013-09-11 2 views
2

Я распечатываю msghdr.msg_namelen после возврата recvmmsg(), но не установлен.recvmmsg() не заполняет msghdr.msg_namelen?

Однако, msg_len установлен правильно.

Я слушаю многоадресный трафик (то есть дейтаграмму).

Есть ли что-нибудь, что мне нужно сделать для recvmmsg() для заполнения msghdr?

Я также попытался вызвать recvmsg(). msghdr также не заполняется. Есть идеи?

+0

Возможно, потому, что на странице руководства для ['recvmmsg()'] (http://linux.die.net/man/2/recvmmsg) не упоминается 'msg_namelen', поэтому он не знает, что он должен быть установленным? –

+0

Он делает. Если вы посмотрите на man-страницу recvmmsg(), он попросит пользователя обратиться к recvmsg(). Если вы посмотрите на man-страницу recvmsg(), в ней упоминается: «msg_name может указываться как нулевой указатель, если имена не требуются или не требуются». Затем, если вы посмотрите на файл заголовка msghdr, в комментарии для msghdr.msg_namelen указано «Длина адресных данных», то есть msghdr.msg_name. – Hei

+0

Кроме того, если бы я попытался напечатать поле, которого не существует, gcc не позволит мне скомпилировать либо :) – Hei

ответ

1

В ядре recvmsg() и recvmmsg() имеют общий подканал, который просто использует msg_namelen и msg_name в качестве входных аргументов. То есть вы должны сами установить этих членов.

Вы можете попытаться думать таким образом, имя msg_name является указателем на строку, которую вы поставляете ядру перед вызовом recvmsg(). Если вы не установили msg_namelen, ядро ​​никогда не узнает длину области msg_name и не знает, сколько байтов можно скопировать в область msg_name, не вызывая ошибки доступа к памяти.

+0

Спасибо за ваш ответ. У меня есть аналогичная мысль о том, что вы написали. Однако я думал, что recvmmsg() сможет заполнить эти поля из заголовка необработанного пакета. – Hei

+0

Кроме того, recvmsg() (not recvmmsg()) принимает msghdr как параметр. Если recvmsg() ожидается, что msghdr ожидает, что вызывающий абонент заполнит эти 2 поля, то почему вызывающий должен был передать в msghdr, когда вызывающий абонент уже знает, что такое адрес и длина. Разве вы так не думаете? – Hei

+0

@Hei, ядро ​​должно знать максимальную длину msg_name, в противном случае, если вы разделили 16-байтовую область на имя msg_name, но длина адреса msg отличается, например, 32 байт, тогда ядро ​​перезапишет вашу область msg_name, вызывая неожиданную ошибку программного обеспечения , – user2760751

Смежные вопросы