#include #include #include #include #include #include #include #include #include #define BUFF_SIZE 100 int initialisationServeur(char* service) { int sock_fd; struct addrinfo precisions, *resultat=NULL, *origine; // On stocke dans précisions nos besoins pour le socket, dans resultat l'adresse qui respectera les reqêtes memset(&precisions, 0, sizeof precisions); precisions.ai_family = AF_UNSPEC; precisions.ai_socktype = SOCK_STREAM; precisions.ai_flags = AI_PASSIVE; if(getaddrinfo(NULL, service, &precisions, &origine)<0) { fprintf(stderr, "Erreur getaddrinfo\n"); return(-1); } int n=0; for(struct addrinfo* i=origine; i!=NULL && resultat==NULL; i=i->ai_next) { printf("%d - ", n); if(i->ai_family==AF_INET) { resultat=i; printf("Test : %d", origine->ai_addrlen); } printf("\n"); n++; } struct sockaddr_in* test=(struct sockaddr_in*)(resultat->ai_addr); printf("Addr : %x\n", test->sin_addr.s_addr); if((sock_fd=socket(resultat->ai_family, resultat->ai_socktype, resultat->ai_protocol))<0) { fprintf(stderr, "Erreur socket\n"); return(-1); } int val=1; if(setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR|SO_BROADCAST, &val, sizeof(val))<0) { fprintf(stderr, "Erreur setsockopt\n"); return(-1); } if(bind(sock_fd, resultat->ai_addr, resultat->ai_addrlen)) { fprintf(stderr, "Erreur bind\n"); return(-1); } if(listen(sock_fd, 20) < 0) { fprintf(stderr, "Error listen server socket\n"); return (-1); } freeaddrinfo(origine); return sock_fd; } void reponseConnexion(int sock) { printf("Connected\n"); char buffer[BUFF_SIZE]; FILE* sockdial_stream = fdopen(sock, "a+"); while(strcmp(buffer, "EXIT\n")!=0) { fgets(buffer, BUFF_SIZE, sockdial_stream); printf("Le message reçu : %s", buffer); fprintf(sockdial_stream, "Ceci est une réponse du serveur TCP.\n"); } printf("Fin de la connexion\n"); fclose(sockdial_stream); } int boucleServeur(int socket, void(* fctConnex)(int)) { int sock_dial; printf("------- Début boucle serveur TCP -------\n\n"); while(1) { printf("-- boucle --\n"); if((sock_dial=accept(socket, NULL, NULL)) < 0){ fprintf(stderr, "Error accept dialogue\n"); return -1; } printf("Dialogue ACCEPTED\n"); fctConnex(sock_dial); } } void argPortParsing(int argc, char* argv[], char* port) { struct option port_arg={"port", 1, NULL, 'p'}; char opt; int longindex; while( (opt=getopt_long(argc, argv, "p:", &port_arg, &longindex)) !='p' && opt!=-1) {} if(opt=='p') { strcpy(port, optarg); printf("%s\n", optarg); } else { printf("La syntaxe doit être ./sioux -p ou ./sioux --port "); } } int main(int argc, char* argv[]) { char port[10]="80"; argPortParsing(argc, argv, port); int sock_fd=initialisationServeur(port); if( sock_fd==-1 ) { fprintf(stderr, "Initialisaiton du serveur impossible\n"); return -1; } boucleServeur(sock_fd, reponseConnexion); return 0; }