2012-05-23 4 views
5

Мне нужно принять несколько соединений с одним и тем же портом. Я использую socket в C++, я хочу сделать что-то вроде SSH. Я могу сделать ssh user @ machine «ls -lathrR /» и запустить другую команду на том же компьютере, даже если первый из них все еще запущен.Несколько соединений в одном порту сокета C++

Как я могу это сделать?

Спасибо.

+0

Если это не для понимания программирования сокетов, я бы предложил не использовать простые сокеты. Вместо этого используйте сетевую инфраструктуру. [ACE] (http://www.cs.wustl.edu/~schmidt/ACE-overview.html) или [ZeroMQ] (http://www.zeromq.org/). Изначально было бы неплохо делать ванильные сокеты, но со временем это становится беспорядочным. – Vikas

+0

Я попытался прослушать порт снова в другом потоке, но он не сработал, он говорит, что порт используется, поэтому я спросил;) – Lefsler

+0

Нет ничего особенного, что вам нужно сделать. Вы все еще слушаете, так что не пытайтесь снова слушать. –

ответ

10

Что вы хотите - это многопоточный сервер сокетов.

Для этого вам нужен основной поток, который открывает сокет для прослушивания (и ждет входящих соединений клиента). Это должно входить в цикл while.

Затем, когда клиент подключается к нему, функция accept() будет разблокирована и в этот момент вам нужно будет обслуживать клиентский запрос, передав запрос потоку, который будет работать с ним.

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

Вы можете либо создавать потоки по мере необходимости, либо использовать пул потоков, который может быть более эффективным (сохранение во время инициализации новых потоков).

Посмотрите here для получения более подробной информации. Ищите многопоточный серверный сокет в сети, в частности bind(), listen() и accept() со стороны сервера.

+0

Я попробую, потому что, если я хочу подключиться, он говорит, что адрес уже используется. – Lefsler

+0

это может произойти, если вы пытаетесь привязать порт, уже используемый другим приложением. какой порт пытается слушать? – fduff

+0

Мне нужно 2 приложения для отправки данных в один и тот же порт, например ssh, когда вы отправляете более одной команды одновременно. – Lefsler

1

Вам необходимо ознакомиться с ::listen() и ::accept().

Первый будет устанавливать вашу розетку для прослушивания. Затем вам нужен цикл (возможно, в его собственном потоке), который использует ::accept(), который будет возвращаться каждый раз при появлении нового соединения.

В этом цикле должен появиться новый поток, которому вы должны передать дескриптор файла, полученный от ::accept(), а затем обрабатывать все операции ввода-вывода в этом сокете.

0

Старый вопрос старый, но я чувствую, что никто, кто ответил, не понимал вопрос ОП.

Вы не понимаете, как работает ssh. Когда вы отправляете несколько команд/несколько подключений к серверу по ssh, на сервере, на котором вы подключаетесь, на самом деле есть только одна программа, которая получает все эти команды.

Sshd (ssh daemon) работает на сервере и является многопоточным сервером сокетов (см. Ответ fduff). Это единственная программа, которая прослушивает порт 22 и сама обрабатывает все входящие ssh-соединения.

+0

Спасибо, Консо, но я уже решил проблему несколько месяцев назад. – Lefsler

Смежные вопросы