Programmation Avancée en C


socket_UDP_server.c

00001 #include <stdio.h> 
00002 #include <stdlib.h> 
00003 #include <unistd.h>
00004 #include <string.h>    
00005 #include <sys/types.h>
00006 #include <sys/socket.h>
00007 #include <netinet/in.h>
00008 #include <arpa/inet.h>
00009 
00010 #define MAX_SIZE 256
00011 #define NUMPORT  6666    // Le port où les utilisateurs se connecteront 
00012 
00013 void error(char * msg);  // cf. ligne /*@\ref{network::socket_TCP_client::error} du listing~\ref{network::socket_TCP_client}@*/
00014 void traitement(int desc_sock); 
00015 int main()               /*** SERVEUR UDP ***/
00016 {
00017         int desc_sock;
00018         struct sockaddr_in adr_svr;   // Pour l'adresse IP locale du serveur.
00019 
00020         memset(&adr_svr, 0, sizeof(adr_svr)); // Initialisation de la structure.
00021         adr_svr.sin_family      = AF_INET;
00022         adr_svr.sin_addr.s_addr = htonl(INADDR_ANY);
00023         adr_svr.sin_port        = htons(NUMPORT);
00024 
00025         /*** Création de la socket. ***/
00026         if ((desc_sock = socket(PF_INET,SOCK_DGRAM,0)) == -1)
00027                 error("[socket]");
00028 
00029         /*** Attachement de la socket. ***/
00030         if (bind(desc_sock, (struct sockaddr *) &adr_svr, sizeof(adr_svr)))
00031                 error("[bind]");
00032 
00033         while(1) // Boucle principale pour traitement.
00034                 traitement(desc_sock);
00035         return EXIT_SUCCESS;
00036 }
00037 
00038 void error(char * msg) {
00039         perror(msg);
00040         exit(EXIT_FAILURE);
00041 }
00042 
00043 void traitement(int desc_sock) {
00044         char requete[MAX_SIZE+1], reponse[MAX_SIZE] = "Nonnnnnnnnn !";
00045         size_t answer_size = strlen(reponse)+1;
00046         struct sockaddr_in cl_addr;
00047         memset(&cl_addr, 0, sizeof(cl_addr)); // Initialisation de la structure.
00048         socklen_t lon = sizeof(cl_addr);  // Ne pas oublier d'initialiser lon!!!
00049 
00050         ssize_t n = recvfrom(desc_sock, requete, MAX_SIZE-1, 0, // Réception.
00051                              (struct sockaddr *)&cl_addr, &lon);
00052         if (n < 0) error("[recvfrom]");
00053         requete[MAX_SIZE] = '\0';
00054         printf(" - Requête reçue de %s:%d : <%s> (%ld octets reçus)\n", 
00055                inet_ntoa(cl_addr.sin_addr), ntohs(cl_addr.sin_port),
00056                requete, (long) n);
00057 
00058         n = sendto(desc_sock, reponse, answer_size, 0, // Émission de la réponse.
00059                    (struct sockaddr *) &cl_addr, lon);
00060         if ( n != answer_size ) error("[sendto]");
00061         printf(" - Réponse émise: <%s> (%ld octets envoyés)\n", reponse, (long) n);
00062 }