Как я могу сделать так, чтобы на моем сервере были открытые соединения с несколькими клиентами одновременно? - PullRequest
0 голосов
/ 05 декабря 2008

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

Ответы [ 7 ]

3 голосов
/ 05 декабря 2008

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

Взгляните на превосходное Руководство Биджа по сетевому программированию . В своем уроке select () он создает небольшой чат-сервер.

1 голос
/ 05 декабря 2008

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

1 голос
/ 05 декабря 2008

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

0 голосов
/ 05 декабря 2008

вы также можете использовать 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
}
0 голосов
/ 05 декабря 2008

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

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

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

0 голосов
/ 05 декабря 2008

взгляните на select, pselect и poll .

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

0 голосов
/ 05 декабря 2008

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

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

...