int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
select est bloquant jusqu´à expiration du délai fourni dans une structure timeval en 5 ème argument, ou jusqu´à que ce que des données
soient présentes sur le descripteur de la socket ( que l´on ajoute à la structure fdset avec la macro FD_SET et que l´on teste avec FD_ISSET)
ça permet ainsi de gérer plusieurs descripteurs de socket en même temps ( comme Lightness1024 l´a dit on pourrait autrement utiliser les threads)
pour ton serveur de tchat, tu pourrais faire quelque chose du genre ( fait à la va-vite):
int main() {
int ret; /* valeur de retour de select */
char buffer[LEN]; /* buffer de LEN octets qui contient les données à lire/réecrire sur le flux du client */
int fd, fa; /* fd sock serveur, fa sock client */
fd_set fds; /* structure fds pour select */
struct timeval tv;
int fs_max;
int end=0; /* incrémenté si déconnexion */
int n; /* nombre d´octets lus avec read */
/* . ..
code d´initialisation du serveur ( bind, listen et accept)
. .. */
while(!end) {
FD_ZERO(&);
FD_SET(fd, &);
fs_max=fd;
FD_SET(fa, &);
if ( fa > fdmax) fs_max = fa;
ret=select(fs_max + 1, &, NULL, NULL, &);
if(ret < 0) exit(-1); /* erreur */
if(ret) /* données disponibles */ {
if(FD_ISSET(fa, &)) { /* des données sont présentes sur fa */
n=read(fa, buffer, sizeof(buffer));
write(fd, buffer, n); /* on les lit puis on les écrit sur fd */
} if(FD_ISSET(fd, &)) { /* données présentes sur fd */
n=read(fd, buffer, sizeof(buffer));
if(strstr("quit", buffer) end++; /* si " quit" présent dans les données lues alors on sort de la boucle */
write(fa, buffer, n); }
} /* . .. */ }
ce code ne gère qu´un seul client et n´est pas compatible ANSI, reste à faire le portage sous windows et à utiliser un tableau dynamique pour
pouvoir gérer plusieurs clients à la fois
un exemple de code, inspiré de l´article d´yves mettier sur le même thème ( paru dans lfm 41): http://www.imats.org/~virgil/releases/chat.c
@+