Ce comportement est normal.
Select fonctionne de la facon suivante;
tu lui passe un ensemble (en fait 3, mais considerons seuleemtn la lecture) de descripteur de fichier a monitorer. select modifie cet ensemble en retirant les descripteurs de fichier sur lesquels il n'y a rien a lire.
Quand tu sors du select ligne 12, si il n'y a rien a lire sur ce descripteur de fichier, alors select le retire de l'ensemble. Du fait au premier tour de boucle, le serveur socket est bien present dans l'ensemble mais il a disparu au deuxieme tour.
Traditionnellement, les developpeurs reinitialise le FD_SET avant chaque appel a select.
PS: moi aussi j'ai envie de pendre le gars qui a pondu cette fonction.