Descrição do servidor de chat do tutorial do beej (selectserver.c)
- É um servidor TCP concorrente e uniprocesso.
- Utiliza E/S multiplexada para pedidos de conexão e recepção de dados.
- Atende um número variável de clientes.
- Cada cliente possui um descritor de socket conectado.
- Toda mensagem enviada por um cliente é ecoada para todos os outros clientes.
- Ao fechar uma conexão o cliente é retirado da lista de clientes "ativos".
Descrição do código fonte
- define e zera duas structs tipo fd_set: master e read_fs
master vai conter a lista dos clientes correntemente ativos; ela é copiada
para read_fs no início do laço principal, imediatamente antes do select sobre read_fs.
Razão: ao retornar select altera os bits de read_fs ligando apenas os dos clientes
que acabaram de enviar dados ou que fecharam sua conexão.
- cria um descritor de socket de escuta listener = socket(...))
- inicializa struct myaddr com socket local do servidor
- bind(listener...)
- listen(listener)
- liga o bit de listener em master: FD_SET(listener, &master)
- inicializa fdmax = fdmin= listener
Obs: fdmin+1 ... fdmax serão os futuros descritores de sockets conectados
- inicia laço principal: for(;:)
- read_fs = master : equivale ao comando FD_SET sobre todos os descritores de
sockets conectados
- select(fdmax+1,&read_fs, ...) bloqueia à espera de uma entrada
- ao sair de select varre todos os descritores de sockets começando por listener:
for(i=fdmin; i<=fdmax...)
- se listener "pronto" temos uma nova conexão completada:
obtém o descritor de socket conectado: newfd= accept(listener, ...)
Obs: ele será o "identificador interno" desse novo cliente
atualiza master com newfd
atualiza fdmax, se preciso
exibe mensagem no vídeo do servidor
- senão temos dados prontos de algum cliente:
obtem dados desse cliente via recv
se cliente fechou a conexão retire o seu descritor de master
- se é um cliente antigo, varra os sockets conectados e envie a mensagem
recebida do mesmo para todos os outros clientes.
Sugestão: para facilitar a depuração, exiba no vídeo do servidor todas as
mensagens que ele envia aos clientes.