указание порта источника и назначения в сокете

#java #sockets #tcp

#java #сокеты #tcp

Вопрос:

Я создаю сокет для связи по протоколу TCP и хотел бы знать, как указать порт источника.

 Socket socket = new Socket();
socket.connect(dstAddress);
  

Комментарии:

1. Как правило, это очень плохая идея. Это ограничивает вас одним исходящим подключением к этой цели за раз и двумя минутами между последовательными подключениями. Если это вызвано правилом исходящего брандмауэра, его следует удалить, а netadmin повторно обучить. Правила исходящего порта ничего не добавляют к безопасности брандмауэра.

2. вы вызывали, bind() чтобы установить адрес src до или после вызова connect() ?

3. Сначала я выполнил connect () перед bind (), это вызывало исключение, затем я сделал наоборот, bind () затем connect (), и это сработало, но порт на стороне клиента по-прежнему выделяется автоматически. Это не тот порт, который я передаю в адресе привязки

4. Я думаю, что для этого есть причины. Порт источника является идентификатором для стека TCP / IP, чтобы распознать, какое соединение он обрабатывает в данный момент. Когда вы выполнили connect () для выполнения задания X, стек назначает вам порт PPP, если затем вы успешно привяжете этот порт для выполнения задания Y, представьте, что есть входящее соединение, ищущее порт PPP, как, по предположению стека, это соединение предназначено для задания X или Y? Поскольку будет безумием сканировать всю систему на предмет всех недоступных портов (порт прослушивания), система выделит для вас порт источника и убедится, что он уникален.

Ответ №1:

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

однако @EJP является правильным. Не делайте этого легкомысленно, поскольку в конечном итоге вы можете оказаться не в состоянии создать сокет, если что-то другое использует этот порт или даже если ваша программа недавно использовала его и закрыла.

Если это не работает, возможно, вам потребуется посмотреть библиотеку, которую вы используете.

Ответ №2:

Сокет имеет несколько конструкторов. Попробуйте это

Комментарии:

1. Ссылка не существует

Ответ №3:

Вы должны использовать inetsocket ADDRESS, объявленный в пакете java.net . Самый простой способ использовать это:

Inetsocket address(хост, порт)), что-то вроде этого:

 Socket socket = new Socket();
socket.connect(new InetSocketAddress("http://myserver.com", 80));
  

Которые подключаются к веб-серверу, прослушивающему порт 80 в myserver.com .