Я хочу написать свой собственный чат-сервер в C на машине MacOS. Теперь я хочу подключиться ко всем клиентам, находящимся в сети, и открыть соединение, чтобы получать и отправлять сообщения. Проблема в том, что я знаю только, как иметь одно соединение сокета за один раз. Таким образом, только один клиент может подключиться до сих пор, и общение в чате как-то скучно;)Как сделать мой сервер открытым подключением к нескольким клиентам одновременно?
ответ
Простейшим решение для небольшого чат-сервера, вероятно, должно использовать select() или pselect().
Посмотрите на отличный Beej's Guide to Network Programming. В своем select() tutorial он создает небольшой чат-сервер.
Один из вариантов заключается в использовании многопоточности с библиотекой pthreads. Другой вариант - использовать асинхронный ввод-вывод с вызовом select(2)
. С select(2)
вы открываете кучу сокетов, а затем вы можете опросить их, чтобы посмотреть, есть ли у него данные. Если у него есть данные, вы читаете его, иначе вы переходите к следующему сокету.
В основном вам необходимо иметь гнездо для прослушивания на выбранном вами порту. После установления соединения с гнездом для прослушивания вам необходимо открыть новый сокет с другим номером порта и передать клиента этому новому сокету. Лучше всего попытаться использовать предварительно написанную библиотеку сокетов, так как ваш собственный сайт будет сложным процессом.
Попробуйте найти http://sourceforge.net для некоторых библиотек образцов.
Если все сделано правильно, вам потребуется только один номер порта. После того, как один клиент подключится к нему, он все равно может принять другое соединение от другого клиента. – BCS 2008-12-05 07:13:38
посмотреть select, pselect и poll.
Я никогда не использовал их сам, но я подозреваю, что они предназначены для того, что вы хотите.
Нет проблем, чтобы иметь несколько подключенных сокетов в одной программе, и вам не нужно возиться с многопоточным процессом. Просто продолжайте открывать соединения, как вы привыкли. Если все ваши клиенты подключаются к одному слушателю, просто не закрывайте слушателя после accept()
- он будет продолжать слушать больше входящих подключений.
Используйте select()
или poll()
для проверки входящих данных обо всех открытых сокетах. Не забудьте включить слуховой сокет в список дескрипторов для select()
- входящее соединение - событие select()
.
Это действительно очень просто. Никакой ракетной науки.
Поскольку Mac OS X основана на FreeBSD, для лучшей и наиболее эффективной программы вы должны использовать kqueue
вы также можете использовать вилочные на принять, как это:
int listen_fd, new_fd;
while ((new_fd = accept(listen_fd, NULL, NULL)) != -1) {
if (fork())
close(new_fd);
else
// handle client connection
}
- 1. Подключить сервер к нескольким клиентам
- 2. Маршрутизация Dart нескольким клиентам одновременно
- 3. Ответ нескольким клиентам, использующим сервер
- 4. Изменение сервера, позволяющего нескольким клиентам подключаться одновременно
- 5. сервер python tcp, отправляющий данные нескольким клиентам
- 6. Java-сокеты, сервер отправляет сообщение нескольким клиентам
- 7. Отправка файлов нескольким клиентам?
- 8. Подключение к нескольким клиентам TCP modbus
- 9. Выдача сообщений нескольким клиентам
- 10. Поток аудио нескольким клиентам
- 11. Как использовать многопоточность, позволяющую нескольким клиентам подключаться к серверу?
- 12. Нажатие сообщения нескольким клиентам через SignalR
- 13. Как применить стили к нескольким классам одновременно?
- 14. Служба, которая делает подключения tcp к нескольким клиентам
- 15. Как получить доступ к нескольким клиентам в VB.Net Программирование сокетов
- 16. PyQt QTcpServer: как вернуть данные нескольким клиентам?
- 17. Как чат-серверы распространяют сообщения нескольким клиентам?
- 18. Python SocketServer: отправка нескольким клиентам?
- 19. проблемы с подключением к нескольким wpf-окнам
- 20. Как применить изменения к нескольким контроллерам одновременно?
- 21. Как реализовать передачу Node.js нескольким клиентам
- 22. Как отправить одно сообщение нескольким клиентам
- 23. Как разрешить нескольким клиентам общаться с сервером?
- 24. Как разрешить новым клиентам доступ к нескольким методам в WCF?
- 25. Как сделать мой сервер многопоточным?
- 26. Передача данных в реальном времени нескольким клиентам
- 27. Подключение к нескольким устройствам BLE одновременно iOS
- 28. socket.io присоединяется к нескольким комнатам одновременно
- 29. Присоединение события click к нескольким элементам одновременно?
- 30. Прикосновение к нескольким кнопкам одновременно в android
Обратите внимание, что эти два выбора не являются взаимоисключающими. Вы можете прослушивать один поток и выбирать(), отправлять задания другим потокам. – gnud 2008-12-05 16:52:31