Сокет C++ параллельный сервер

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

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

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

У меня есть он этот путь:

ЧАСТЬ A

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

ЧАСТЬ B

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

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

5
задан user369450 23 January 2014 в 15:38
поделиться

1 ответ

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

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

Поэтому у вас есть два варианта:

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

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

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

3
ответ дан 15 December 2019 в 06:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: