2017-02-22 17 views
1

Я пытаюсь установить TCP/IP-соединение между контроллером (клиентом) и программой на своем ПК (сервере) с использованием C++, я использовал сниффера, чтобы видеть, как отправляются запросы клиента и Я узнал, что каждый запрос на подключение от контроллера отправляется с другого порта и известного IP-адреса, он запускается со случайным номером порта и увеличивается на 1 с каждым запросом до тех пор, пока я не перезапущу контроллер или сервер не получит запрос. У меня есть некоторые вопросы.Клиентский порт изменяется с каждым запросом

1- Это стандартное поведение, и какова идея этого, зная, что контроллер является контроллером Mitsubishi?

2- Есть ли способ получить новый порт контроллера без использования accept?

+0

Ожидаемое поведение. Подумайте обо всех случаях сбоев, которые могут произойти, если клиент всегда использовал один и тот же номер порта. Простой - это поздние пакеты из предыдущего соединения, пытающиеся проникнуть в законные пакеты для нового соединения. – user4581301

+0

Если исходный порт был исправлен, что произойдет, если клиент попытается сделать два одновременных соединения с одним и тем же сервером? – Dmitri

+0

Я вижу, что некоторые из них вводят ошибку в коде, если сокет закрыт по какой-либо причине, я должен заставить контроллер отправить новый запрос или связь не будет установлена, и это не будет доступно все время – Mahjob

ответ

0

Это не столько поведение контроллера, сколько сетевого стека, работающего над контроллером, и его можно интегрировать в аппаратное обеспечение контроллера (ключевое слово поиска: разгрузка TCP).

  1. Ожидаемое поведение. Чтобы предотвратить всевозможные неприятные побочные эффекты, простым примером являются поздние пакеты из предыдущего соединения, пытающиеся проникнуть в законные пакеты для более позднего соединения, порт не перерабатывается для повторного использования в течение длительного периода после закрытия сокета с использованием порта , Возможно, ваш порт недоступен для использования. Простое решение - это точно выполнить то, что сделал сетевой стек OP: последовательно назначать следующий номер порта.

  2. Не для сокетов BSD. accept принимает соединение с клиентом. Если вы не согласны, вы не получите сокет для связи с этим соединением и с сокетом, вам все равно, что это за порт. Это все отвлечено и скрыто вне поля зрения.

Если это проблема, рассмотрите возможность использования протокола без установления соединения, такого как UDP. Вы не получаете автоматическую повторную передачу, когда обнаруживается потеря пакетов, и все другие приятные вещи, которые TCP делает для вас, но накладные расходы отсутствуют.