Чат-сервер-клиент на C. Использование потоков или процессов? - PullRequest
3 голосов
/ 19 ноября 2011

Прежде всего, среда, над которой я работаю, это Windows 7 и Visual Studio 2010 .

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

Также я написал клиент, который подключился к серверу выше, запустив (client.exe localhost 4444 Peter). «Питер» - это имя пользователя, которое этот пользователь хочет использовать.

Теперь предположим, что у нас есть два пользователя, подключенных к серверу. У каждого из них есть возможность запустить команду /help. Это возвращает некоторые другие команды, которые пользователь может использовать. Одной из команд является /listusr, которая возвращает всех пользователей на сервере.

Еще одна команда - /talk2, и здесь начинается мой проблемный вопрос. Я хочу позволить пользователю выбирать, с кем из других пользователей хотят общаться. Например, если вы хотите поговорить с Питером, вы даете /talk2 Peter.

Как я собираюсь начать что-то подобное? Как сервер отправит мне сообщение в Питер (я должен добавить, что при подключении нового пользователя сервер сохраняет свое имя пользователя и номер своего сокета в структуре)?

Нужно ли создавать новые темы для каждого разговора или новых процессов? Может кто-нибудь дать мне подсказку или совет продолжить мой проект? Я немного запутался в том, как управлять на этом этапе.

Ответы [ 3 ]

2 голосов
/ 19 ноября 2011

Ни. Ваш сервер должен поддерживать некую структуру данных, которая соответствует идентификатору пользователя и дескриптору клиентского сокета. Когда приходит запрос с помощью команды /talk2, сервер должен найти соответствующий дескриптор сокета для этого идентификатора пользователя и просто ретранслировать это сообщение, используя send().

1 голос
/ 19 ноября 2011

Масштабируемым способом было бы, если бы ваш сервер просто сказал обоим клиентам IP-адрес другой стороны, а затем Питер и вы установили соединение, чтобы вы могли говорить.

Если вы действительно хотите иметьЧтобы перевести разговор, вам необходимо учесть следующее, чтобы получить лучшую масштабируемость:

  • Использовать UDP вместо TCP
  • Используйте поток вместо процесса
0 голосов
/ 19 ноября 2011
  • Создание нового процесса было бы тяжелым испытанием для сервера, если число пользователей, взаимодействующих одновременно, велико.Но, с другой стороны, код будет проще.
  • Потоки обеспечивают масштабируемость, но тогда вы должны быть очень осторожны в своем коде, чтобы не делать глупостей.(Например, отправка неправильных чатов не тем парням.)
  • Используйте методы выбора / опроса (я не уверен, как они работают в среде Windows, но это прекрасно работает с Linux.)
  • UDP сократит время передачи, но я не уверен, что это хорошая идея.Поскольку вы сказали, что у вас уже есть код, было бы очень трудно переключиться на UDP.
  • Просто отправка адреса требуемого клиента также является приемлемой идеей.Это снижает нагрузку на сервер, но теперь вам потребуются выделенные клиенты.

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

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