2012-04-19 3 views
0

Мой вопрос: Как, (с помощью select()) я могу узнать, подключен ли новый клиент на моем сервере? A не может просто использовать accept, потому что accept() блокирует ...Как узнать, подключен ли новый клиент к сокету с select()

Пример: У меня есть два клиента, установленных на fd user1 (fd = 4) и user2 (fd = 5). Таким образом, я использую выбрать, чтобы знать, кто пишет на сокете:

FD_ZERO(read_fds); 
    FD_SET(user1, read_fds); 
    FD_SET(user2, read_fds); 
    error = select(user2 + 1, read_fds, NULL, NULL, NULL); 
    if (FD_ISSET(user1, read_fds) == 1) 
    printf("user1 talks.\n"); 
    ... 

Но я хочу знать, если новый пользователь подключается к серверу, что я могу сделать? меня попробовать:

FD_ZERO(read_fds); 
    FD_SET(user1, read_fds); 
    FD_SET(user2, read_fds); 
    FD_SET((user2 + 1), read_fds); 
    error = select(user2 + 2, read_fds, NULL, NULL, NULL); 
    if (FD_ISSET(users2 + 1) == 1) 
    { 
     printf("New user.\n"); 
     accept(..., ...); 
    } 
    ... 

Но с этим кодом, выберите возвратного -1 каждый раз ...

раствор? ^^

ответ

1

Вы должны хранить подключенные клиенты где-нибудь, например, список.

struct client_node 
{ 
    int sockfd; 
    /* Other data that might be needed */ 
    struct client_node *next; 
}; 

struct client_node *client_list = NULL; 

/* ... */ 

FD_ZERO(&read_fds); 
FD_SET(listening_socket, &read_fds); 

int maxfd = listening_socket; 

for (struct client_node *c = client_list; c; c = c->next) 
{ 
    FD_SET(c->sockfd, &read_fds); 
    maxfd = MAX(maxfd, c->sockfd); 
} 

int res = select(maxfd + 1, &read_fds, NULL, NULL, NULL); 

Что касается вопроса блокировки для accept, как вы можете видеть, я добавил сокет (переменная listening_socket), что это гнездо вы прослушиваете. Когда select говорит, что вы можете читать, это означает, что есть новое соединение и вы можете вызвать accept.

+0

Все в порядке! Спасибо. – Zat42

Смежные вопросы