LINUX.ORG.RU

udp получить адрес назначения пакета


0

1

Есть сетевой интерфейс со множеством адресов, программа слушает 0.0.0.0, необходимо определять адрес назначения входящего udp пакета
Делал согласно http://stackoverflow.com/questions/3062205/setting-the-source-ip-for-a-udp-so..., но ipi_addr содержит 0.0.0.0
Что я мог упустить ?

★★★★★

Что я мог упустить ?

забыл привести _свой_ код ?? (в объёме: создание сокета, орг.цикла чтения, непосредственно приём)

p.s. выхлоп ifconfig заодно приложи.

p.p.s. [telepathy] а может у вас v6 включен и получаете вы адреса и структуры именно в его виде ?

MKuznetsov ★★★★★
()
Ответ на: комментарий от x905

странно..интерфейс оно вроде как угадывает

На уровне экперимента: попробовать поставить setsockopt(sock, IPPROTO_IP, IP_PKTINFO, &sockopt, sizeof(sockopt)) после bind.

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

нет, не помогло

в качестве альтернативы я реализовал bind на каждый интерфейс, но где то в районе 1000 происходит ошибка EMFILE
попытался увеличить /proc/sys/fs/file-max, но не помогло (по умолчанию было 98187, но и это с запасом), наверно не тот параметр

программа служит для тестов эмуляции внешних устройств для другой программы, поэтому и решение со множеством bind подойдет, но хотел «более красиво» сделать

x905 ★★★★★
() автор топика
Ответ на: комментарий от no-dashi

тред читать непринято ? ТС адрес получателя надо узнать. То есть по какому интерфейсу (точнее на который IP-шник) прилетело UDP при условии bind INADDR_ANY. А это только через recvmsg, но что-то несрастается..

MKuznetsov ★★★★★
()

union control_data где объявлен? Поле msg_flags после получения пакета что содержит?

Deleted
()
Ответ на: комментарий от Deleted

union control_data где объявлен?

#define DSTADDR_DATASIZE (CMSG_SPACE(sizeof(struct in_addr)))
union control_data
{
struct cmsghdr cmsg;
u_char data[DSTADDR_DATASIZE];
};

Поле msg_flags после получения пакета что содержит?

msg.msg_flags == 8

хм, увеличил размер данных - получил src, спасибо за наводку !!!
(да и в man это есть, не обратил внимание)
осталось определиться с размером, но 100 байт хватает

определение control_data я брал тут http://groups.google.com/group/comp.os.linux.development.system/msg/e09d9c278... (ссылка внутри stackoverflow была)

x905 ★★★★★
() автор топика
Ответ на: комментарий от x905

Пример небрежный, его нельзя так просто (без исправлений) скомпилировать.

Допустим, переопределение cmsg:

union control_data  cmsg; 
...
for(cmsghdr *cmsg = CMSG_FIRSTHDR(&msg)

Поэтому не понятно, что такое cmsg и вобще, может под «msg.msg_control = &cmsg» нужно побольше места?

У меня работает IP_PKTINFO, поэтому если от вас будет рабочий пример, который скомпилируется gcc-4.4.4, то я его попробую запустить у себя. Тогда можно будет сказать, дело в коде или в вашей системе, где ядро/glibc не передают нужную информацию.

mky ★★★★★
()
Ответ на: комментарий от mky

проблема была в моем коде (данная область для меня новая, потому и упустил некоторый момент), т.к. просто скопипастил корявый пример из ссылки и не понял где ошибся

x905 ★★★★★
() автор топика
Ответ на: комментарий от x905

msg.msg_flags == 8

Как и ожидалось. Понятно, что DSTADDR_DATASIZE, объявленного вышеуказанным способом, на struct in_pktinfo не хватит.

MSG_CTRUNC      = 0x08, /* Control data lost before delivery.  */

осталось определиться с размером, но 100 байт хватает

Я бы не парился и выделил на msg_control обычный массив в 1024 байта. Без заморочек с union. Места в юзерспейсном стеке не жалко.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.