Как я могу создать простой сервер только с 2 клиентами в C ++? - PullRequest
3 голосов
/ 30 октября 2011

Мне нужно создать сервер, позволяющий подключаться к ОДНОМУ клиенту.Правило состоит в том, что только один клиент может быть подключен, и если другой пытается подключиться, может прочитать сообщение типа «другой клиент подключен, вы хотите отключить его?».Затем, если набрать yes, клиент будет отключен.

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

Спасибо.

Ответы [ 2 ]

0 голосов
/ 30 октября 2011

Другой вариант (если вы не хотите работать с несколькими потоками или несколькими процессами) - это использовать select () или poll () для одновременной обработки нескольких сокетов в одном потоке.В частности, вы можете выбрать () - для чтения на принимающем сокете и select () вернется с этим сокетом, помеченным как готовый для чтения, всякий раз, когда другой клиент пытается подключиться.Как только у вас есть accept () для клиента, вы можете передать клиентский сокет соединения (как было возвращено accept ()) для select () read-sockets-set, так что вы также будете уведомлены, когда сокет клиентабайты готовы к прочтению.И так далее.

0 голосов
/ 30 октября 2011

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

Вы должны хранить один синглтон, содержащий ссылку (или указатель, по вашему выбору) на Worker с подключенным в данный момент клиентом (или ноль, если не подключен ни один).

Для простоты поток-получатель должен создавать новый поток Worker каждый раз, когда он принимает соединение, и поток Worker прерывается, когда разрывается соединение.

Теперь вам нужно подумать о протоколе. Для этой простой задачи 5 сообщений должно быть достаточно. Возможно, каждое сообщение оканчивается на endl, поэтому вы можете использовать такие методы, как readline, если что-то подобное есть в C ++.

Во-первых, сообщение CONNECT. Сервер должен вернуть OK (второе сообщение), если к нему никто не подключен, и ERROR (третье сообщение), если оно уже подключено.

Четвертое сообщение - CONNECTWITHDISCONNECT, оно соединяет клиента с сервером и отключает любого другого клиента. Вновь подключенный клиент должен получить с сервера сообщение OK, а отключенный - DISCONNECT (пятое сообщение).

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

Клиент должен сначала отправить CONNECT, если он получает ERROR, затем он может попросить пользователя отключить другого клиента, а если пользователь хочет, клиент отправит CONNECTWITHDISCONNECT.

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