Создать случайный используемый порт - PullRequest
2 голосов
/ 14 февраля 2012

Я пишу программу на C, в которой сервер прослушивает общеизвестный порт, ожидает подключения клиента, а затем создает случайный порт для использования клиентом и отправляет этот номер порта обратно клиенту.Моя главная сложность заключается в том, как создать «случайный» порт.Должен ли я просто использовать srand и создать случайный 4-значный порт?Или есть лучший способ сделать это?Я знаю, что если я использую порт 0, для меня будет выбран порт, но проблема здесь в том, что я не думаю, что могу «получить / увидеть» фактическое значение порта, чтобы я мог отправить этот номер порта обратноклиенту.

Спасибо ...

Ответы [ 4 ]

2 голосов
/ 14 февраля 2012

То, что вы делаете, это bind() с портом, установленным на 0. Система назначит его. Затем используйте getsockname(), чтобы узнать, какой порт назначен системе. Отправьте это обратно клиенту. Таким образом, нет условий гонки, и вы будете следовать любым системным правилам для назначения портов.

2 голосов
/ 14 февраля 2012

Порт привязки 0 является решением. Он дает вам произвольный порт, а не случайный порт, но это то, что делают многие приложения (например, FTP и т. Д.).

После связывания вы можете использовать getsockname, чтобы выяснить, какой порт вы получили.

0 голосов
/ 14 февраля 2012

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

0 голосов
/ 14 февраля 2012

Случайный 4-значный порт, проверенный, чтобы убедиться, что он не используется, подходит для этой цели.

С технической точки зрения, кажется, что вы пытаетесь реализовать это для дополнительной безопасности (какой-торутина примитивного порта)?Возможно, стоит упомянуть, что этот подход обычно не считается слишком безопасным.Это также накладывает некоторые искусственные ограничения на количество клиентов, которые вы можете обслуживать одновременно, и фактически добавляет ненужную нагрузку на сервер.Почему бы просто не прослушивать один известный порт для всех клиентов?

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