#include #include #include #include #include #define SERVADDR "127.0.0.1" // Définition de l'adresse IP d'écoute #define SERVPORT "0" // Définition du port d'écoute, si 0 port choisi dynamiquement #define LISTENLEN 1 // Taille du tampon de demande de connexion #define MAXBUFFERLEN 1024 #define MAXHOSTLEN 64 #define MAXPORTLEN 6 int main(){ int ecode; // Code retour des fonctions char serverAddr[MAXHOSTLEN]; // Adresse du serveur char serverPort[MAXPORTLEN]; // Port du server int descSockRDV; // Descripteur de socket de rendez-vous int descSockCOM; // Descripteur de socket de communication struct addrinfo hints; // Contrôle la fonction getaddrinfo struct addrinfo *res; // Contient le résultat de la fonction getaddrinfo struct sockaddr_storage myinfo; // Informations sur la connexion de RDV struct sockaddr_storage from; // Informations sur le client connecté socklen_t len; // Variable utilisée pour stocker les // longueurs des structures de socket char buffer[MAXBUFFERLEN]; // Tampon de communication entre le client et le serveur // Initialisation de la socket de RDV IPv4/TCP descSockRDV = socket(AF_INET, SOCK_STREAM, 0); if (descSockRDV == -1) { perror("Erreur création socket RDV\n"); exit(2); } // Publication de la socket au niveau du système // Assignation d'une adresse IP et un numéro de port // Mise à zéro de hints memset(&hints, 0, sizeof(hints)); // Initailisation de hints hints.ai_flags = AI_PASSIVE; // mode serveur, nous allons utiliser la fonction bind hints.ai_socktype = SOCK_STREAM; // TCP hints.ai_family = AF_INET; // seules les adresses IPv4 seront présentées par // la fonction getaddrinfo // Récupération des informations du serveur ecode = getaddrinfo(SERVADDR, SERVPORT, &hints, &res); if (ecode) { fprintf(stderr,"getaddrinfo: %s\n", gai_strerror(ecode)); exit(1); } // Publication de la socket ecode = bind(descSockRDV, res->ai_addr, res->ai_addrlen); if (ecode == -1) { perror("Erreur liaison de la socket de RDV"); exit(3); } // Nous n'avons plus besoin de cette liste chainée addrinfo freeaddrinfo(res); // Récuppération du nom de la machine et du numéro de port pour affichage à l'écran len=sizeof(struct sockaddr_storage); ecode=getsockname(descSockRDV, (struct sockaddr *) &myinfo, &len); if (ecode == -1) { perror("SERVEUR: getsockname"); exit(4); } ecode = getnameinfo((struct sockaddr*)&myinfo, sizeof(myinfo), serverAddr,MAXHOSTLEN, serverPort, MAXPORTLEN, NI_NUMERICHOST | NI_NUMERICSERV); if (ecode != 0) { fprintf(stderr, "error in getnameinfo: %s\n", gai_strerror(ecode)); exit(4); } printf("L'adresse d'ecoute est: %s\n", serverAddr); printf("Le port d'ecoute est: %s\n", serverPort); // Definition de la taille du tampon contenant les demandes de connexion ecode = listen(descSockRDV, LISTENLEN); if (ecode == -1) { perror("Erreur initialisation buffer d'écoute"); exit(5); } while( 1 ){ len = sizeof(struct sockaddr_storage); // Attente connexion du client // Lorsque demande de connexion, creation d'une socket de communication avec le client descSockCOM = accept(descSockRDV, (struct sockaddr *) &from, &len); if (descSockCOM == -1){ perror("Erreur accept\n"); exit(6); } // Echange de données avec le client connecté strcpy(buffer, "BLABLABLA\n"); write(descSockCOM, buffer, strlen(buffer)); //Fermeture de la connexion close(descSockCOM); } close(descSockRDV); }