Мульти-клиенты на сервере - PullRequest
0 голосов
/ 26 марта 2011

Для приложения на C мне нужно ответить более чем одному клиенту.

Я устанавливаю соединение с помощью кода, например,

    bind(...);
    listen(...);
    while(1){
        accept(...);//accept a client
        recv(...);//receive something
        send(...);//send something to client
        bzero(buf);//clear buffer
    }  

Это прекрасно работает, когда у меня только один клиент.Другие клиенты также могут подключаться к серверу, но, хотя они и что-то командуют, сервер не отвечает клиентам, которые подключились после первого клиента.Как я могу решить эту проблему?

Ответы [ 3 ]

2 голосов
/ 26 марта 2011

Запись сервера с использованием асинхронных неблокирующих соединений.

Вместо единого набора данных о клиенте необходимо создать структуру.Каждый экземпляр структуры содержит данные для каждого клиента.

Код выглядит примерно так:

socket(...)
fcntl(...) to mark O_NONBLOCK
bind(...)
listen(...)
create poll entry for server socket.
while(1) {
    poll(...)
    if( fds[server_slot].revents & POLLIN ) {
        accept(...)
        fcntl(...) mark O_NONBLOCK
        create poll and data array entries.
    }
    if( fds[i].revents & POLLIN ) {
        recv(...) into data[i]
        if connection i closed then clean up.
    }
    if( fds[i].revents & POLLOUT ) {
        send(...) pending info for data[i]
    }
 }

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

0 голосов
/ 26 марта 2011

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

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

В то время как основной поток будет обрабатывать возможные новые входящие клиенты, другие потоки будут обрабатывать recv / send.

0 голосов
/ 26 марта 2011

i need to response more than one clients.

Использование Threading .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...