TCP-сервер прослушивает несколько клиентов одновременно в C - PullRequest
1 голос
/ 14 октября 2010

Я написал код C для TCP-сервера для одновременного прослушивания одного клиента ... но мне трудно понять, как заставить сервер прослушивать несколько клиентов одновременно.

Кто-нибудь знает хороший урок или пример, объясняющий это?

Спасибо!

Ответы [ 7 ]

2 голосов
/ 14 октября 2010

Оформить заказ http://www.zeromq.org/ Это довольно крутая сетевая (или обмен сообщениями) библиотека, которая убирает из кода 'select' или традиционные сокеты.

2 голосов
/ 14 октября 2010

Взгляните на libevent. Он поддерживает несколько популярных серверных приложений с высокой масштабируемостью.

2 голосов
/ 14 октября 2010

Есть несколько способов добиться этого, некоторые из которых:

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

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

Опция select означает, что ваш код должен управлять несколькими сеансами, что иногда можетзапутаться.

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

1 голос
/ 14 октября 2010

На какой ты платформе?Если это Windows, API популярной платформы - WaitForMultipleObjectsEx .Если это Linux, популярный выбор от нижнего до более высокого уровня может быть select (как упомянуто Джошуа), epoll, kqueue или libevent / libev (аналогичные, но немного отличающиеся библиотеки, которые находятся средидругие уровни абстракции на предыдущих API).

select достаточно переносим, ​​но в большинстве случаев не является оптимальным (многое было изучено с момента его создания).Тем не менее, если вам не нужна сумасшедшая производительность и вы хотите придерживаться довольно стандартного программирования на C, это был бы хороший выбор, и есть масса литературы, которая ссылается на это.И как только ваш сервер работает с select, не должно быть слишком сложно изменить его на один из более продвинутых API мультиплексирования.

0 голосов
/ 21 февраля 2011

не знаю, имеет ли это какое-либо отношение к этому, но ... может использовать вариант:

listener.Start()
While True
    Dim user As New chatclient(listener.AcceptTcpClient)
End While
0 голосов
/ 14 октября 2010

Просто создайте другого слушателя, когда предыдущий был взят

0 голосов
/ 14 октября 2010

см. Man 2 select

Это должно делать то, что вы хотите.Осторожно, не проверено:

listen_any(int n, int *s, void receiver(int *))
{
    FD_SET set;
    int x = -1;
    int i;
    for (i = 0; i < n; ++i)
        if (x < s[i]) x= s[i];
    while (1) {
        FD_ZERO(&set);
        for (i = 0; i < n; ++i)
            FD_SET(s[i], fd);
        select(x, &set, NULL, NULL, NULL);
        for (i = 0; i < n; ++i)
            if (FD_ISSET(s[i], fd)) {
                struct socakddr sa;
                int len = sizeof(sa);
                int sn = accept(s[i], &sa, &len);
                if (sn >= 0) {
                    if (!receiver(sn))
                       close(sn);
                }
            }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...