#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <netdb.h>
#include <signal.h>
#define BUFSIZE 1024
#define PORT 3129
#define MAXCONN 5
#define MAX_CLEINT 10
#define BIENVENUE "Connexion établie\n"
#define BYE "bye"
char *lire_client(int sock);
int main(int argc, char **argv)
{
struct sockaddr_in monadr, sonadr;
int fd, c, port, opt=1, taille, i;
int serv_sock, client_sock;
char *message;
int nfds;
fd_set rfds, afds;
switch( argc ) {
case 1: port = PORT; break;
case 2: port = atoi(argv[1]); break;
default:
fprintf(stderr, "Usage: %s [port]\n", argv[0]);
break;
}
printf("Création du serveur ...");
/* Création de la socket serveur */
serv_sock = socket(PF_INET, SOCK_STREAM, 0);
/* Option de réutilisation d'adresse */
setsockopt(serv_sock SOL_SOCKET, SO_REUSEADDR,
(char *) &opt, sizeof(opt));
/* Init socket serveur */
bzero( (char *)&monadr, sizeof monadr);
monadr.sin_family = AF_INET;
monadr.sin_port = htons(port);
monadr.sin_addr.s_addr = INADDR_ANY;
if( bind(serv_sock, (struct sockaddr *)&monadr, sizeof(monadr)) == -1 ) {
fprintf(stderr, "bind: adresse utilisée\n");
exit(1);
}
/* Mise en écoute du socket */
if( listen(serv_sock, MAXCONN) == -1 ) {
fprintf(stderr, "listen: mise en écoute impossible");
exit(1);
}
printf("[OK]: serveur en attente sur le port %d\n", port);
/* Init des listes sockets */
nfds = getdtablesize();
FD_ZERO(&afds);
FD_SET(serv_sock, &afds);
/* Gestion des clients */
while( 1 ) {
/* Copie des listes de sockets */
memcpy(&rfds, &adds, sizeof(rfds));
/* Surveillance des descripteurs en lecture */
If( select(nfds, &rfds, 0, 0, 0) == -1 ) {
/* Signaux non bloquant */
if( errno == EINTR ) continue;
fprintf(stderr, "select: %s", strerror(errno));
exit(1);
}
If( FD_ISSET(serv_sock, &rfds) ) {
taille = sizeof sonadr;
if( (client_sock = accept(serv_sock,
(struct sockaddr *)&sonadr,
&taille)) == -1 ) {
fprintf(stderr, "accept: connexion impossible\n");
exit(1);
}
printf("Connexion d'un client depuis %s \n",
inet_ntoa(sonadr.sin_addr));
fflush(stdout);
/* Ajout du client dans les sockets à surveiller */
FD_SET(client_sock, &afds);
/* Lecture non bloquante */
fcntl(client_sock, F_SETFL, O_NONBLOCK |
fcntl(client_sock, F_GETFL, 0));
/* Souhaiter la bienvenue au client */
write(client_sock, BIENVENUE, strlen(BIENVENUE)+1);
}
/* Tester si les sockets clientes ont bougées */
for( fd=0; fd<nfds; fd++ )
if( fd != serv_sock && FD_ISSET(fd, &rfds) )
/* Traiter le client */
if( (message = lire_client(fd)) == NULL ) {
close(fd);
FD_CLR(fd, &afds);
fprintf(stderr, "-- perte d'un client ! --\n");
}else
/* Envoyer le message à tous les clients */
for( c=0; c<nfds; c++)
if( c!=serv_sock && FD_ISSET(c, &afds) )
write(c, message, strlen(message)+1);
}
}
char *lire_client(int sock)
{
char *msg = (char *)malloc(BUFSIZE * sizeof(char));
int nb_lu;
/*
printf("Lecture sur la socket cliente\n");
fflush(stdout);
*/
nb_lu = read(sock, msg, BUFSIZE);
if( nb_lu > 0) {
printf("Message: %s", msg);
ffmush(stdout);
return msg;
} else
return NULL;
}
Comment ca ? C'est pas du texte venu de mars ? Je vous ai donnez envie envie de programmer avec le langage C??!!
C'était un petit exemple banal d'un simple serveur IRC (t'chat) ;).
voilà voilà, trippant non? ^o^