Como lo hiciste ??? Que opcion potaste de las 2 que te dio
The Queen Of Ice .
De paso te explico que, para hacer un chat no necesitas tanto la explicacion logica (bueno, no del todo), ya que esto varia seguir las necesidades de tu chat, por ejemplo:
Usando SELECTSelect es una funcion que te permite estar al tanto de varios descriptores de archivos (ne ste caso: sockets), de modo que, cuando invocas SELECT() la funcion queda dormida hasta que un usuario envia algo hacia el socket, cuando SELECT se percata que llego algo al socket, la funcion despierta y se ejecuta el codigo que sigue debajo de la funcion select, es por eso que en el ejemplo del tutorial de
Beej (
enlace), la funcion select que posiciona
dentro de un ciclo infinito (
for(;
). La
clave para que entiendas el uso de SELECT(), esta en que asimiles como funciona SELECT y que significa cada opcion del mismo (FD_SET, etc, etc...).
Usando Hilos, Procesos, Exlusion Mutua (mutex).Esta manera es las mas avanzada, pero en lo personal, la mas facil, comoda y con muchas ventajas

, el
precio de esto es que el usuario interesado debe estudiar, conocer y asimilar el uso de Procesos, Hilos, Mutex, por lo tanto equivaldria a aprender sobre tres temas, que si bien, se aventura a ello, traeria muy buenas ventajas en su desarrollo de codigos

. Practicamente la secuencia de un chat con estas modalidades seria asi:
1- Creas un ciclo infinito ( while(1) ), invocando
accept() (reciviendo clientes).
2- Cuando un cliente se conecte, le creas un procesos para dicho socket.
3- Cuando se haya creado el proceso, creas 2 hilos.
4- Hilo 1, para envio de datos.
5- Hilo 2, pra recepcion de datos.
6- Entre la opcion 1 y 2, creas inicializas el Mutex.
OJO:
estas opciones que yo te doy varian segun el gusto y costumbres de cada programador.