Получение сокета FD от IP-адреса и порта - PullRequest
1 голос
/ 29 июля 2010

Есть ли у них способ (кроме циклов на всех открытых FD) получить FD для данного IP addr & port? У меня есть несколько открытых UDP-сокетов, каждый из которых связан с IP-адресом и портом. Приложение, в некоторых случаях, действует как прямое приложение. Это getfdbyname системный вызов?

В частности, мое UDP-приложение (C) находится между узлами A и B.

1) A отправляет сообщение C, используя source Port 2000, destination port 3000, полученное C

2) C затем должен переслать это на port 3000 узла B, используя порт 2000.

На шаге 1 открытый сокет, связанный с port 3000, получает сообщение. Однако на этом этапе мне нужно получить FD для границы сокета port 2000 для пересылки сообщения.

Какие-нибудь идеи, кроме зацикливания на всех настроенных сокетах?

Ответы [ 3 ]

3 голосов
/ 29 июля 2010

Вы можете сохранить хэш адресов => сопоставления сокетов.

Обычно я использую структуру, состоящую из адреса и сокета FD, представляющих хост, с которым я общаюсь. Затем у меня есть функция поиска, которая находит эту структуру по адресу.

2 голосов
/ 29 июля 2010

Вы можете взглянуть на strace netstat -anlp, который показывает, что вы можете посмотреть в /proc/net/udp, чтобы найти список всех сокетов, например:

sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode  
53: 0100007F:0035 00000000:0000 07 00000000:00000000 00:00000000 00000000   103        0 11075 2 ffff1231230f90c0 

Это показывает, как «какой-то процесс» прослушивает порт UDP 53 (для медленного считывателя 0x0035 == 53 и 0x0100007F - localhost)

Индод (11075) является ссылкой на fd. Глядя в /proc/<bindpid>/fd/ видим:

...
lrwx------ 1 bind bind 64 2010-07-20 06:26 513 -> socket:[11075]
...

Значит, это 513. Я не предлагаю вам следовать этому маршруту, но я думаю, что это как минимум один способ получить то, что вы просили.

1 голос
/ 29 июля 2010

Нет, такого вызова нет, но с UDP вам не нужен отдельный сокет для каждого хоста / порта назначения - вот для чего нужен sendto(3) (если вы на самом деле connect(2) не используете свой UDPрозетки).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...