C ++ сокет параллельный сервер - PullRequest
5 голосов
/ 12 мая 2010

Я пишу параллельный сервер, который должен иметь канал связи и канал данных.

Клиент сначала подключается к каналу связи для проверки подлинности, после успешной проверки подлинности клиент затем подключается к каналу данных для доступа к данным.

Моя программа уже делает это, и я использую потоки. Моя единственная проблема заключается в том, что если я пытаюсь подключиться к другому клиенту, я получаю сообщение об ошибке «невозможно связать: адрес уже используется».

У меня так:

ЧАСТЬ A

Клиент подключается к порту 4567 (и вводит свои данные для входа). Поток создается для обработки клиента (повторяется для каждого подключенного клиента). В созданном потоке у меня есть функция (назовем ее FUNC_A), которая проверяет информацию для входа в систему клиента (не беспокойтесь о том, как выполняется проверка), в случае успеха поток запускает сервер данных (прослушивает 8976), затем отправляет клиенту OK, после получения клиент пытается подключиться к серверу данных.

ЧАСТЬ B

Как только клиент подключается к серверу данных, изнутри FUNC_A клиент принимается, и создается другой поток для обработки соединения клиента с сервером данных (надеюсь, все ясно). Теперь все это работает нормально. Однако, если я пытаюсь соединиться со вторым клиентом, когда он попадает в ЧАСТЬ B, я получаю сообщение «ошибка связывания: адрес уже используется». Я пробовал так много разных способов, я даже пытался порождать поток, чтобы запустить сервер данных и принять клиента, а затем запустить другой поток для обработки этого соединения. Все еще не повезло.

Пожалуйста, дайте мне предложение относительно того, что я делаю неправильно, как мне поступить, или как лучше всего это реализовать. Спасибо

1 Ответ

3 голосов
/ 12 мая 2010

Ваша проблема заключается в следующем: " ... поток запускает сервер данных (прослушивает 8976) ... "

Если я правильно вас понимаю, при каждом подключении клиента вы пытаетесь начать прослушивание порта 8976. Однако проблема в том, что на данном порту может прослушиваться только один сокет. Когда вы снова попытаетесь прослушивать этот же порт, вы получите эту ошибку.

Следовательно, у вас есть два варианта:

  1. Пусть сервер прослушивает свободный порт (просто укажите 0 при привязке) и отправьте номер порта клиенту, чтобы клиент мог подключиться к нему.
  2. Запустите сервер только один раз, в начале, и пусть он принимает клиентские соединения.

Второй вариант, однако, имеет большую проблему: как вы собираетесь отличать одного клиента от другого? Поэтому я рекомендую перейти с первым вариантом.

Пищу для размышлений: то, что вы описываете, в значительной степени именно так работает FTP. И FTP-серверы используют первый вариант. Возможно, не случайно? ; -)

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