Чат-сервер с сокетами в C - PullRequest
       2

Чат-сервер с сокетами в C

2 голосов
/ 14 сентября 2010

Я пытаюсь написать чат-сервер на C, который позволяет общаться между двумя клиентами с помощью сокетов POSIX. Я не уверен, что хорошо разбираюсь в этой концепции или в том, как мне настроить протокол связи между клиентами и сервером.

Я знаю, что мне нужен один сокет для bind() порта сервера, чтобы я мог принимать входящие соединения от клиентов, но для одновременного подключения двух клиентов мне нужно создать сокет для каждого из этих клиентов когда я accept() или я accept() клиент, а затем fork(), чтобы я мог принять другого клиента? Я пока не беспокоюсь о параллельном чате, это скорее пинг-понг, когда клиентам нужно подождать recv() после того, как они send(), прежде чем они смогут напечатать новое сообщение.

Ответы [ 3 ]

4 голосов
/ 14 сентября 2010

У вас есть два способа обработки нескольких клиентов: использование неблокирующего ввода-вывода и использование потоков. Для небольших вещей, таких как чаты, я предпочитаю неблокировать, так как мне не нужно беспокоиться о блокировках и потоках. Проверьте функции select и poll.

Основной цикл будет делать что-то вроде этого:

  1. собрать набор со всеми fd, которые вы хотите слушать
  2. ждать, пока select вернется
  3. используйте FD_ISSET для проверки входящих соединений на вашем главном диске (который вы передаете для прослушивания). Затем вы можете accept() и сохранить новый файл в своем списке подключений.
  4. обрабатывает остальные интересующие вас fd-файлы (просматривайте список с помощью FD_ISSET для проверки активных сокетов).
2 голосов
/ 14 сентября 2010

Когда вам accept возвращается новый сокет для этого клиента, вы можете порождать поток в этот момент для работы с этим клиентом.В этом потоке вы можете recv и send к этому новому возвращенному сокету, чтобы общаться с вашим подключенным клиентом.

Вы должны продолжить accept с предыдущим сокетом.то, что вы определяете, должно определять, кто отправляет сообщения в каком порядке.

0 голосов
/ 14 сентября 2010

Когда вы используете более одного сокета одновременно (т.е. в трехстороннем чате), самый простой способ обработки сокетов - это блокировка внутри select () или poll (), который будет возвращаться всякий раз, когда данные становятсядоступно по крайней мере на одной из розеток.Затем вы можете использовать FD_ISSET (), чтобы выяснить, какие сокеты имеют данные, готовые для чтения, и вызвать recv () для них.

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