Задать вопрос
@ratatyq

Может ли TCP соединение работать сразу с несколькими клиентами?

Здравствуйте, увидел на 1 форуме тему как человек написал сервер где он использовал TCP соединение и он не может организовать подключение сразу нескольких клиентов, и вот что бы перестраховатся решил задать вопрос: А можно ли с помощью протокола TCP держать несколько клиентов на 1 сервере, вед как известно протокол TCP умеет держать соединение с клиентом мб его проблема заключается в том что данный протокол не поддерживает так много одновременных соединений?
  • Вопрос задан
  • 3825 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
@nirvimel
TCP соединение - это сокет. Открытый сокет связывает конкретный порт на локальной машине с конкретным портом на конкретной удаленной машине (и никак иначе). Открытый сокет соединяет всегда две стороны. Не существует многосторонних сокетов. Но на одной машине может быть открыто сколько угодно сокетов.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
TCP-сервер на все время ожидания подключений открывает 1 серверный (LISTENING) сокет (привязывая его к конкретному номеру порта).
В момент подключения каждого очередного клиента функция ACCEPT создает новый серверный сокет, предназначенный для обмена с этим конкретным клиентом.

Итого: в каждый момент времени серверная программа держит активным 1 LISTENING-сокет + N INCOMING-сокетов для обмена данными по количеству активных в текущий момент клиентских подключений.
Ответ написан
Комментировать
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
вед как известно протокол TCP умеет держать соединение с клиентом мб его проблема заключается в том что данный протокол не поддерживает так много одновременных соединений?
это каламбур?!)
Ответ написан
Комментировать
Rou1997
@Rou1997
Конечно может, ведь все существующие протоколы прикладного уровня, например HTTP, созданы на основе TCP, в HTTP и запрос и ответ - это TCP-пакеты, клиентов явно поддерживается много, просто на каждого клиента создайте свой поток с циклом чтения, еще в одном потоке принимайте клиентов (accept) и создавайте потоки с циклами, а если требуется отправить пакет клиенту вне цикла чтения (по какому-то действию со стороны сервера), то поток стало быть еще один нужен, или просто в основном потоке (GUI), а в некоторых библиотеках, например Qt, потоки реализованы "из коробки" в самих классах и достаточно подписаться на сигналы (события).
Ответ написан
Комментировать
@anikavoi
Так. Раскладываю по полкам:

TCP соединение - это уже установленная связь между сокетами. Многосторонним быть не может.
На серверах сокет, после соединения, быстренько копируют, выпихивают в отдельный поток, где он начинает обслуживать соединившегося с ним клиента, а порт, в основном потоке, снова переводят в состояние ожидания соединения и ждут аксептом следующего соединения.
Примеры на разных языках доступны в гугле по запросу "multithreading server"
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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