2008-12-05 4 views
0

Я хочу написать свой собственный чат-сервер в C на машине MacOS. Теперь я хочу подключиться ко всем клиентам, находящимся в сети, и открыть соединение, чтобы получать и отправлять сообщения. Проблема в том, что я знаю только, как иметь одно соединение сокета за один раз. Таким образом, только один клиент может подключиться до сих пор, и общение в чате как-то скучно;)Как сделать мой сервер открытым подключением к нескольким клиентам одновременно?

ответ

3

Простейшим решение для небольшого чат-сервера, вероятно, должно использовать select() или pselect().

Посмотрите на отличный Beej's Guide to Network Programming. В своем select() tutorial он создает небольшой чат-сервер.

1

Один из вариантов заключается в использовании многопоточности с библиотекой pthreads. Другой вариант - использовать асинхронный ввод-вывод с вызовом select(2). С select(2) вы открываете кучу сокетов, а затем вы можете опросить их, чтобы посмотреть, есть ли у него данные. Если у него есть данные, вы читаете его, иначе вы переходите к следующему сокету.

+0

Обратите внимание, что эти два выбора не являются взаимоисключающими. Вы можете прослушивать один поток и выбирать(), отправлять задания другим потокам. – gnud 2008-12-05 16:52:31

0

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

Попробуйте найти http://sourceforge.net для некоторых библиотек образцов.

+0

Если все сделано правильно, вам потребуется только один номер порта. После того, как один клиент подключится к нему, он все равно может принять другое соединение от другого клиента. – BCS 2008-12-05 07:13:38

0

посмотреть select, pselect и poll.

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

0

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

Используйте select() или poll() для проверки входящих данных обо всех открытых сокетах. Не забудьте включить слуховой сокет в список дескрипторов для select() - входящее соединение - событие select().

Это действительно очень просто. Никакой ракетной науки.

1

Поскольку Mac OS X основана на FreeBSD, для лучшей и наиболее эффективной программы вы должны использовать kqueue

0

вы также можете использовать вилочные на принять, как это:

int listen_fd, new_fd; 

while ((new_fd = accept(listen_fd, NULL, NULL)) != -1) { 
    if (fork()) 
     close(new_fd); 
    else 
     // handle client connection 
} 
Смежные вопросы