LINUX.ORG.RU

Проблема с bind-ингом UDP порта

 , ,


0

1

Добрый вечер. Не пойму, почему моя программа не может получить доступ к UDP порту. В лог-файлах пишет следующее:

Jun 18 18:01:17 myserver mydaemon0[3904]: bind error for udp error string: 'Address already in use'
Jun 18 18:01:17 myserver mydaemon0[3904]: not binding to 4005 port

смотрю, что выдаёт netstat:

root@myserver:~# netstat -atulpn
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1754/rpcbind
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 2495/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 3130/exim4
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 2749/mysqld
tcp 0 0 0.0.0.0:37322 0.0.0.0:* LISTEN 1807/rpc.statd
tcp 0 0 192.168.0.99:22 192.168.0.130:54276 ESTABLISHED 2780/0
tcp6 0 0 :::111 :::* LISTEN 1754/rpcbind
tcp6 0 0 :::8080 :::* LISTEN 2249/apache2
tcp6 0 0 :::80 :::* LISTEN 2249/apache2
tcp6 0 0 :::22 :::* LISTEN 2495/sshd
tcp6 0 0 ::1:25 :::* LISTEN 3130/exim4
tcp6 0 0 :::44730 :::* LISTEN 1807/rpc.statd
tcp6 0 0 192.168.0.99:80 192.168.0.130:44882 TIME_WAIT -
tcp6 0 0 192.168.0.99:80 192.168.0.130:44881 TIME_WAIT -
tcp6 0 0 192.168.0.99:80 192.168.0.130:44883 ESTABLISHED 2899/apache2
udp 0 0 0.0.0.0:68 0.0.0.0:* 1850/dhclient
udp 0 0 0.0.0.0:68 0.0.0.0:* 1848/dhclient
udp 0 0 0.0.0.0:111 0.0.0.0:* 1754/rpcbind
udp 0 0 0.0.0.0:657 0.0.0.0:* 1754/rpcbind
udp 0 0 0.0.0.0:65209 0.0.0.0:* 1848/dhclient
udp 0 0 127.0.0.1:711 0.0.0.0:* 1807/rpc.statd
udp 0 0 0.0.0.0:43207 0.0.0.0:* 1850/dhclient
udp 0 0 0.0.0.0:49897 0.0.0.0:* 1807/rpc.statd
udp6 0 0 :::32813 :::* 1807/rpc.statd
udp6 0 0 :::111 :::* 1754/rpcbind
udp6 0 0 :::657 :::* 1754/rpcbind
udp6 0 0 :::65209 :::* 1850/dhclient
udp6 0 0 :::11527 :::* 1848/dhclient

и вижу, что нигде мой порт не встречается. правда, в выводе netstata я не вижу записей с нужного мне интерфейса - на сервере их 3:

root@myserver:~# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default readynas.netgea 0.0.0.0 UG 0 0 0 eth0
192.168.0.0 * 255.255.255.0 U 0 0 0 eth0
192.168.10.0 * 255.255.255.0 U 0 0 0 eth5
192.168.11.0 * 255.255.255.0 U 0 0 0 eth6

Я пытаюсь открыть UDP порты 4005 на 192.168.10.0 и на 192.168.11.0 и получаю 'Address already in use' Подскажите, пожалуйста, в чём может быть проблема?

Ответ на: комментарий от post-factum

это вызов функции:

arsServ = bindUdpPort(4005, "192.168.10.2");

А это сама функция:

int bindUdpPort (int udpPort, const char *udpIP)
{
    struct sockaddr_in a;
    int s;
    int yes;
    if ((s = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
    	my_log(LOG_ERR, "socket for bind not available");
        return -1;
    }
    yes = 1;

    if (setsockopt
        (s, SOL_SOCKET, SO_REUSEADDR,
         (char *) &yes, sizeof (yes)) < 0) {
    	my_log(LOG_ERR, "setsockopt error for listener");
        close (s);
        return -1;
    }

    memset (&a, 0, sizeof (a));
    a.sin_port = htons (udpPort);
    a.sin_family = AF_INET;
    if (!inet_aton(udpIP, &a.sin_addr)) {
    	my_log(LOG_ERR, "invalid udp IP");
    	close (s);
    	return -1;
    }
    if (bind
        (s, (struct sockaddr *) &a, sizeof (a)) < 0) {
    	my_log(LOG_ERR, "bind error for udp  error string: '%s'", strerror(errno));
        close (s);
        return -1;
    }
	my_log(LOG_INFO, "wait connection on port %d", (int) udpPort);
    return s;
}

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

Я пытаюсь открыть UDP порты 4005 на 192.168.10.0 и на 192.168.11.0

arsServ = bindUdpPort(4005, «192.168.10.2»);

А на интерфейсах какие адреса? Вывод «ip a» покажи.

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

вот ifconfig вместо ip a:

root@kurier:~/git/kurier/kurier# ifconfig
eth0 Link encap:Ethernet HWaddr 00:60:e0:57:2a:0c
inet addr:192.168.0.99 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::260:e0ff:fe57:2a0c/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:19308 errors:0 dropped:0 overruns:0 frame:0
TX packets:12360 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2187578 (2.0 MiB) TX bytes:7181685 (6.8 MiB)
Interrupt:23 Memory:febc0000-febe0000

eth5 Link encap:Ethernet HWaddr 00:01:25:3f:52:0b
inet addr:192.168.10.2 Bcast:192.168.10.255 Mask:255.255.255.0
inet6 addr: fe80::201:25ff:fe3f:520b/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:22 errors:0 dropped:0 overruns:0 frame:0
TX packets:32 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1598 (1.5 KiB) TX bytes:4120 (4.0 KiB)

eth6 Link encap:Ethernet HWaddr 00:01:25:b1:c0:27
inet addr:192.168.11.2 Bcast:192.168.11.255 Mask:255.255.255.0
inet6 addr: fe80::201:25ff:feb1:c027/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:15 errors:0 dropped:0 overruns:0 frame:0
TX packets:21 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1634 (1.5 KiB) TX bytes:3294 (3.2 KiB)

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:220 errors:0 dropped:0 overruns:0 frame:0
TX packets:220 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:38464 (37.5 KiB) TX bytes:38464 (37.5 KiB)

leonopulos ()

Я пытаюсь открыть UDP порты 4005 на 192.168.10.0 и на 192.168.11.0 и получаю 'Address already in use'

Унюхал крамолу. А ну давай минималистичный компилируемый пример того, что у тебя валится с ошибкой, поглядим.

Krieger_Od ★★ ()

А эту самую программу никто случайно не убивал? При некорректном завершении приложения сокет может остатся висеть в каком-то полуживом состоянии (к сожалению, не помню названия и как это можно посмотреть). Возможно, что для исправления перезагрузка требовалась. А в код потом добавился флаг SO_REUSE_ADDR, с которым внезапная смерть приложения не страшна - потом можно заново биндится с автоматическим закрытием прежнего сокета.

xaizek ★★★★★ ()
Ответ на: комментарий от post-factum

Там проблема не в том, что программа вылетает, а в том, что непонятно кто захватил мой порт. я не пойму. в листинге netstat только записи, которые относятся к интерфейсу по умолчанию (192.168.0.99) или к нулевому интерфейсу или к 127.0.0.1 а относительно других интерфейсов (которые мне как раз и нужны) - ни одной записи. если, предположим, к ним никто не подчепляется ни по одному из портов, то я-то как раз должен со свистом подключаться. а не получается.

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

Ну я сам и убивал. Но после этого перегружался полностью и тоже самое.

leonopulos ()

Да, забыл сказать, эти интерфейсы, к которым я подключаюсь (192.168.10.2 и 192.168.11.2) являются сетевыми интерфейсами оборудования, работающего через USB. Задействуются драйвера usbnet, cdc_ethert и rndis_host. Собстевнно, rndis_host и генерит endpoint, помоему. Может быть эта инфоримация как-то поможет?

leonopulos ()
Ответ на: комментарий от post-factum

Демон от root-а работает. А на счёт 0.99 только завтра смогу проверить. Сервер на работе.

leonopulos ()

еще посмотри не вызывается ли эта функция у тебя 2 (ДЖВА!) раза с одними параметрами где-нибудь.

anonymous ()
Ответ на: комментарий от post-factum

Биндится ли демон на интерфейс 0.99? От какого пользователя работает демон?

на этот интерфейс тоже не биндится. демон работает от root.

leonopulos ()

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

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