BSD - использовать любой доступный порт? - PullRequest
1 голос
/ 16 августа 2011

Во всех учебных пособиях и примерах, которые я нахожу в Интернете, всегда указывается номер порта, например 7000 или 4950 и т. Д. Что если эти порты открыты на одном компьютере, но на другом?Похоже, этот случай делает эту идею плохой.Есть ли способ сказать "найти и использовать любой открытый порт"?Мой код теперь такой:

//get server info, put into servinfo
if ((status = getaddrinfo("192.168.2.2", port, &hints, &servinfo)) != 0) {
    fprintf(stderr, "getaddrinfo error: %s\n", gai_strerror(status));
    return false;
}

с портом 4950. Это для сокета tcp, но я предполагаю, что это будет та же общая стратегия для udp?

Также быстрый вопрос - если я использую соединения tcp и udp в приложении, должны ли они использовать разные порты?(не чувствовал, что это заслуживает другого вопроса)

1 Ответ

2 голосов
/ 16 августа 2011

Похоже, что этот случай делает плохую идею

Не так, см. Ниже.

Есть ли способ сказать "найти и использовать"любой открытый порт "?

Конечно, вы просто не можете bind или передать NULL как port.Но тогда, как клиенты узнают, где подключиться к ?Вам нужно было бы где-нибудь опубликовать эту информацию.

Вернуться к bind(2).Если вы указываете порт 0, ядро ​​выбирает эфемерный порт при вызове bind.

Вот цитата из TLPI:

Существуют и другие возможности, кроме привязки сокета сервера.на известный адрес.Например, для сокета домена Интернета, сервер может опустить вызов bind () и просто вызвать listen (), что заставит ядро ​​выбрать временный порт для этого сокета.

После этого сервер может использовать getsockname() для получения адреса своего сокета.В этом случае сервер должен опубликовать этот адрес , чтобы клиенты знали, как найти сокет сервера.Такая публикация может быть осуществлена ​​путем регистрации адреса сервера в приложении централизованной службы каталогов, с которым клиенты затем связываются для получения адреса.

Вернуться к вашим вопросам:

Также быстрый вопрос - если я использую соединения tcp и udp в приложении, должны ли они использовать разные порты

Не обязательно.Они не "перепутали".

...