Как данные клиента попадают в подпоток сервера, а не в исходный поток прослушивания? - PullRequest
0 голосов
/ 10 ноября 2018

Мой вопрос касается связи клиент-сервер в следующем сценарии.

Сервер прослушивает порт 21 и способен одновременно обслуживать несколько входящих подключений от клиентов (C1, C2 и т. Д.), Не блокируя их

Таким образом, когда клиент C1 подключается к серверу S через порт 21, сервер принимает подключение в главном потоке и создает новый поток TH1 и позволяет ему обрабатывать запрос клиента, пока основной поток снова начинает перечислять порт 21, чтобы принять новый клиентов.

TH1 отправляет некоторые данные обратно клиенту C1, C1 выдает данные и отправляет дополнительные данные на сервер по тому же соединению, которое было установлено на порту 21.

Эти данные поступают на сервер и принимаются потоком Th1, в то время как основной основной поток Сервера продолжает прослушивать порт 21.

Мой вопрос заключается в том, как дополнительные данные, отправленные клиентом C1 по тому же соединению, которое было установлено на порту 21, автоматически направляются в поток Th1? хотя основной поток сервера прослушивает порт 21 для новых подключений?

1 Ответ

0 голосов
/ 10 ноября 2018

Вам необходимо предоставить любой пакет, который отправляется между клиентом и сервером с уникальным client id. Вам нужен различимый пакет рукопожатия.

Когда сервер получает пакет hand-shake, он запускает поток, присваивает ему идентификатор клиента из пакета и продолжает прослушивать порт 21.

Затем поток отправляет клиенту все, что ему нужно, например, через порт 22, и начинает прослушивание conditional variable.

Когда основной поток сервера получает пакет data на порту 21, он публикует id и сигнализирует conditional variable. Один из ожидающих потоков распознает идентификатор и начнет работать. В качестве альтернативы основной поток может создавать несколько очередей и условных переменных, по одной на поток, и пробуждать только один поток, связанный с идентификатором. Тем временем сервер продолжает слушать.

Не забудьте уничтожить поток либо в пакете good-bye, либо в timeout.

...