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





Один из вариантов - использовать многопоточность с библиотекой pthreads. Другой вариант - использовать асинхронный ввод-вывод с вызовом select(2). С select(2) вы открываете кучу сокетов, а затем можете опросить каждый из них, чтобы узнать, есть ли в нем данные. Если в нем есть данные, вы их читаете, в противном случае вы переходите к следующему сокету.
В основном вам нужно иметь прослушивающий сокет на выбранном вами порту. Как только соединение с прослушивающим сокетом установлено, вам нужно открыть новый сокет на другом номере порта и передать клиента этому новому сокету. Лучше всего попробовать использовать заранее написанную библиотеку сокетов, поскольку создание собственной библиотеки будет сложным процессом.
Попробуйте поискать в http://sourceforge.net несколько библиотек сэмплов.
Если все сделано правильно, вам понадобится только один номер порта. После того, как один клиент подключается к нему, он все еще может принимать другое подключение от другого клиента.
Да, BCS - и это достигается с помощью метода, который я описал выше.
Соединение с прослушивающим сокетом не установлено. Чтобы установить соединение, вам нужно принять его на другом сокете.
Bork, то, что ты говоришь, либо неясно, либо неверно. То, что вы написали, все еще звучит для меня так, как будто вы говорите, что вам нужно принять соединение на другом номере порта для каждого клиента, и я знаю, что это неправильно.
взгляните на выбрать, pselect и голосование.
Я никогда не использовал их сам, но подозреваю, что они предназначены для того, что вы хотите делать.
Нет проблем с несколькими подключенными сокетами в одной программе, и вам не нужно возиться с многопоточностью. Просто продолжайте открывать связи, как раньше. Если все ваши клиенты подключаются к одному слушателю, просто не закрывайте его после accept() - он будет продолжать прослушивать другие входящие соединения.
Используйте select() или poll() для проверки входящих данных на всех открытых сокетах. Не забудьте включить прослушивающий сокет в список дескрипторов для select() - входящее соединение - это событие, которое обнаруживает select().
Это действительно очень просто. Никакого ракетостроения.
Поскольку Mac OS X основана на FreeBSD, для получения лучшей и наиболее эффективной программы вы должны использовать kqueue
вы также можете использовать fork-on-accept, например:
int listen_fd, new_fd;
while ((new_fd = accept(listen_fd, NULL, NULL)) != -1) {
if (fork())
close(new_fd);
else
// handle client connection
}
Самым простым решением для небольшого чат-сервера, вероятно, является использование select () или pselect ().
Взгляните на отличный Руководство Beej по сетевому программированию. В своем select () учебник он создает небольшой чат-сервер.
Обратите внимание, что эти два варианта не исключают друг друга. У вас может быть один поток, который слушает и выбирает (), отправляя задания другим потокам.