2016-08-13 4 views
-1

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

Client: hi 
Server: hi 
Server: I'm the server. 
Server: How are you? 
Client: Good. 

В этом примере сервер не ожидает, пока Клиент ответит, и отправит другое сообщение в любое время.

Должен ли я использовать функцию select?, Если да, как определить тайм-аут и значение таймаута - это решение для оживленного ожидания?

Is select Функция - лучший подход для решения этой проблемы?

Спасибо.

+0

Язык? Платформа? Ошибка? Вопрос? – EJP

ответ

1

Использование select похоже на правильный подход, особенно если вы хотите, чтобы программа работала в Windows. Это позволит вам заблокировать процесс и дождаться сообщения от нескольких клиентов одновременно.

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

Если вы нацеливаете Unices (например, Linux), то проще и эффективнее использовать poll. Это в основном то же самое, но с интерфейсом легче работать. select становится довольно неудобным для использования, если число дескрипторов файла становится больше 1024, что является проблемой, если вы когда-либо ожидали, что ваш сервер обработает большое количество клиентов.

Если вы ориентируетесь на Linux конкретно и не заботитесь о переносимости, вы даже можете использовать epoll, который имеет еще больше преимуществ по производительности и, возможно, проще в использовании.

Если вы ориентируетесь только на Windows, вы можете create event objects для каждого из сокетов, а затем использовать WaitForMultipleObjectsEx, чтобы дождаться данных из любого из них. Это обеспечивает аналогичную функциональность до poll, но API очень популярен.

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