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);
00014 void traitement(int desc_sock);
00015 int main()
00016 {
00017 int desc_sock;
00018 struct sockaddr_in adr_svr;
00019
00020 memset(&adr_svr, 0, sizeof(adr_svr));
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
00026 if ((desc_sock = socket(PF_INET,SOCK_DGRAM,0)) == -1)
00027 error("[socket]");
00028
00029
00030 if (bind(desc_sock, (struct sockaddr *) &adr_svr, sizeof(adr_svr)))
00031 error("[bind]");
00032
00033 while(1)
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));
00048 socklen_t lon = sizeof(cl_addr);
00049
00050 ssize_t n = recvfrom(desc_sock, requete, MAX_SIZE-1, 0,
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,
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 }