Descrição do servidor de chat do tutorial do beej (selectserver.c)

Descrição do código fonte

  1. 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.

  2. cria um descritor de socket de escuta listener = socket(...))

  3. inicializa struct myaddr com socket local do servidor

  4. bind(listener...)

  5. listen(listener)

  6. liga o bit de listener em master: FD_SET(listener, &master)

  7. inicializa fdmax = fdmin= listener
    Obs: fdmin+1 ... fdmax serão os futuros descritores de sockets conectados

  8. inicia laço principal: for(;:)

  9. read_fs = master : equivale ao comando FD_SET sobre todos os descritores de sockets conectados

  10. select(fdmax+1,&read_fs, ...) bloqueia à espera de uma entrada

  11. ao sair de select varre todos os descritores de sockets começando por listener:   for(i=fdmin; i<=fdmax...)
    1. 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

    2. 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

    3. 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.