Двойная привязка сокетов UDP в Linux - PullRequest
0 голосов
/ 05 марта 2010

В C ++, когда я запускаю (красное предупреждение! Псевдокод)

bind(s1, <local address:port1234>)
bind(s2, <local address:port1234>)

на двух разных сокетах UDP (s1 и s2 каждый создан с вызовом socket()) У меня проблемы. В Linux (Ubuntu) двойное связывание выглядит нормально. Однако в Windows двойное связывание завершается неудачно, и вызов bind() во второй раз для того же адреса возвращает != 0.

Я хочу узнать, как я веду себя в Windows на моей машине с Linux. Существуют ли какие-то настройки, которые я могу использовать, чтобы "занять порт" в Linux?

Ответы [ 3 ]

4 голосов
/ 05 марта 2010

См. bind и setsockopt . Если вы не вызвали setsockopt с SO_REUSEADDR, то ваш вызов связывания с тем же адресом должен привести к сбою с EADDRINUSE.

2 голосов
/ 05 марта 2010

Такое поведение я не наблюдаю в Linux. Когда я запускаю следующую тестовую программу, второй вызов bind завершается неудачно с EADDRINUSE:

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main()
{
    int s1, s2;
    struct sockaddr_in sa = {
        .sin_family = AF_INET,
        .sin_port = 0x5555,
        .sin_addr.s_addr = INADDR_ANY };

    s1 = socket(PF_INET, SOCK_DGRAM, 0);
    s2 = socket(PF_INET, SOCK_DGRAM, 0);
    if (bind(s1, (struct sockaddr *)&sa, sizeof sa) < 0)
        perror("bind 1");
    if (bind(s2, (struct sockaddr *)&sa, sizeof sa) < 0)
        perror("bind 2");

    return 0;
}
0 голосов
/ 05 марта 2010

Ты уверен в этом? Согласно man 7 ip на моем Linux-компьютере (fedora 9):

Когда процесс хочет получить новые входящие пакеты или соединения, он должен связать сокет с адресом локального интерфейса, используя bind (2). Только одна IP-розетка может быть связана с любой данной локальной парой (адрес, порт).

Нет упоминания об исключении для привязки UDP в man 7 ip или man 7 udp. (Это ничего не доказывает, но недокументированное поведение в чем-то столь простом, как это ... удивительно.)

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