Могу ли я вызвать bind () и затем connect () для того же дескриптора сокета? - PullRequest
0 голосов
/ 12 июня 2019

Просто любопытный вопрос о программировании сетевых сокетов в приложении Windows с C / C ++:

Как я могу сказать функции connect(), чтобы использовать определенный IP-адрес источника и значения порта источника?

  • После создания сокета приложение вызывает connect() для удаленного IP-адреса и порта, используя структуру sockaddr.

  • , внутренняя функция connect()выбирает IP-адрес источника и порт для подключения.

Вместо того, чтобы система определяла IP-адрес источника и / или порт для connect(), пусть это будет обязанностью приложения решить, к какому IP-адресу источника и / или порту подключаться.

Ответы [ 3 ]

2 голосов
/ 12 июня 2019

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

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

Можно попросить ядро ​​выбрать определенный порт перед вызовом connect(), но если я могу спросить - почему вы не хотите, чтобы ядро ​​выделяло исходные порты, насколько я знаю, это не лучшая практика.

2 голосов
/ 12 июня 2019

Как я могу сказать функции connect () использовать определенный IP-адрес источника и значения порта источника?

Для этого используйте функцию bind() библиотеки сокетов.Да, вы можете позвонить bind() до connect() для исходящего сокета.Это вполне допустимая операция для сокетов UDP и TCP.

0 голосов
/ 14 июня 2019

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

Но будьте осторожны: вы можете выбрать только один из уже настроенных IP-адресов, а не любой адресВы можете себе представить.

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