/** ***************************************************************************************************** * \fn int main(int argc, char* argv[]) * \brief le serveur reçoit/émet les requêtes de la socket * * \param argc le nom de paramètres d'entrée, doit prendre au moins 2 paramètres (numéro de port) pour fonctionner * \param argv les valeurs des paramètres * * \return EXIT_SUCCESS en cas d'arrêt normal du serveur ***************************************************************************************************** */ int main(int argc, char* argv[]) { int numPort,testBind,testAccept,it; char message[20]; reinitialiserMessage(sizeof(message),message); //system("clear"); printf("Bienvenue dans le serveur !\n "); if(argc==2) { numPort=htons(atoi(argv[1]));// le second argument dans le shell deviendra l'adresse du port (convertie en entier par atoi) } else { error(-1,"Utilisation de l'application ./serveur <numéro_Port> \n"); } int socket_UDP,reuse=1; struct sockaddr_in my_addr; socket_UDP=socket(AF_INET,SOCK_DGRAM,0);//ouverture de la socket UDP error(socket_UDP,"Erreur à l'ouverture de la socket ! \n");//gestion d'erreur de l'ouverture socket printf("Le descripteur de socket vaut %d ! \n",socket_UDP); error(setsockopt(socket_UDP,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)),"Erreur initialisation socket \n");//initialisation de la socket error((int)memset((char*)&my_addr,0,sizeof(my_addr))-1,"Erreur initialisation structure d'adresse \n");//initialisation de la structure d'adresse /**********initilisation de l'adresse, du port et du domaine de la socket**********/ my_addr.sin_addr.s_addr=INADDR_ANY; my_addr.sin_port=numPort; my_addr.sin_family=AF_INET; printf(" et l'adresse est %d \n", my_addr.sin_addr.s_addr); testBind=bind(socket_UDP,(struct sockaddr *) &my_addr,sizeof(struct sockaddr));//on lie la structure my_addr à la socket error(testBind,"Erreur lors du bind \n"); /*listen indique que la socket est prête à recevoir des données*/ listen(socket_UDP,1); socklen_t tailleMemoire=(socklen_t) sizeof(struct sockaddr); //on note la taille de la structure d'adresse pour plus tard int tailleRecue=0; char nomFichier[20]; reinitialiserMessage(20,nomFichier); struct sockaddr_in client; int descClient; int testSelect=0; ouvrirConnexionServeur(socket_UDP,(struct sockaddr_in *)&my_addr,numPort); tailleRecue=0; tailleRecue=recvfrom(socket_UDP,message,sizeof(message),0,(struct sockaddr*)&my_addr,&tailleMemoire); printf("message %s \n",message); envoyerFichier(socket_UDP,(struct sockaddr_in *)&my_addr,&tailleMemoire,message); printf("\n"); return EXIT_SUCCESS; }
int main(int argc, char *argv[]) { char requete[100]; /* requete que l'on va envoyer au serveur */ int etatConnexion; /* 1 : connecte / 0 : non connecte */ int choix; /* Choix pour le menu principal */ char nomFichier[100]; /* Nom du fichier */ int c; /* permet de vider le buffer */ int termine; /* permet de savoir si un client a termine ses traitements */ int choixModeTransfert; /* Mode de transfert du fichier, 0 = bloc / 1 = flux */ etatConnexion = 0; choixModeTransfert = 1; /* Mode flux par defaut */ /* On initialise le client */ if(InitialisationAvecService(argv[1],argv[2]) == 0){ /* Erreur sur l'initialisation, message d'erreur affiche par la fonction */ return -1; } /* On se connecte directement sur le serveur */ etatConnexion = connecterUtilisateur(); /* On verifie que l'utilisateur est bien connecte sur le serveur */ if(etatConnexion == 1){ /* On va maintenant afficher le menu principal de l'application */ do{ termine = FALSE; /* Menu principal */ printf("-MENU PRINCIPAL-\n\n"); printf("1 : Envoyer un fichier sur le serveur\n"); printf("2 : Telecharger un fichier stocke sur le serveur\n"); printf("3 : Modifier le mode de telechargement des fichiers (bloc / flux)\n"); printf("4 : Reprendre un telechargement en cours (suite a une erreur)\n"); printf("0 : Se deconnecter\n\n"); printf("Votre choix : "); /* On recupere le choix de l'utilisateur */ if(scanf("%d",&choix) < 1){ /* Erreur saisie */ printf("ERREUR : votre saisie est incorrecte \n\n"); while ( ((c = getchar()) != '\n') && c != EOF); /* on vide le buffer */ }else{ while ( ((c = getchar()) != '\n') && c != EOF); /* on vide le buffer */ /* On regarde le choix de l'utilisateur */ switch (choix){ case 1: /* Envoyer un fichier */ printf("Saisir le nom du fichier que vous voulez envoyer (le fichier doit se trouver dans le repertoire actuel et le nom doit faire 100 caracteres max) : \n"); /* On va lire le nom du fichier au clavier */ fgets(nomFichier,100,stdin); fflush(stdin); /* on vide le buffer */ /* On verifie que on a bien lu quelque chose */ if(nomFichier != NULL){ /* On lance la procedure d'envoi */ envoyerFichier(nomFichier); } break; case 2: /* Telecharger un fichier */ printf("Saisir le nom du fichier que vous voulez telecharger : \n"); /* On va lire le nom du fichier au clavier */ fgets(nomFichier,100,stdin); fflush(stdin); /* on vide le buffer */ /* On verifie qu'on a bien lu quelque chose */ if(nomFichier != NULL){ /* En fonction du mode on appelle la fonction qui correspond */ if(choixModeTransfert == 0){ /* On regarde si le client est lance avec plusieurs serveurs <=> nb arguments > 2 */ if(argc > 3){ /* on va pouvoir faire du telechargement parallele */ pthread_t tabThread[argc-2]; /* Tableau de thread de longueur = au nombre de serveurs */ int i; /* indice de parcours du tableau */ /* On boucle pour creer les threads */ for(i=0;i<argc-2;i++){ donneesThread *donnees = malloc(sizeof(donneesThread)); strcpy(donnees->numPort,argv[i+2]); strcpy(donnees->nomFichier,nomFichier); donnees->numeroServeur = i+1; donnees->nombreServeurs = argc-2; pthread_create(&tabThread[i], NULL, telechargerFichierBlocThread,(void *) donnees); } /* On boucle pour mettre le programme en attente */ for(i=0;i<argc-2;i++){ pthread_join(tabThread[i], NULL); } }else{ /* On telecharge normal depuis un seul serveur */ telechargerFichierBloc(nomFichier); } }else{ /* On lance la procedure d'envoi */ telechargerFichier(nomFichier); } } break; case 3: /* Modification du mode de transfert */ do{ printf("Quel mode de transfert voulez-vous choisir :\n"); printf("1 : Mode bloc\n"); printf("2 : Mode flux\n"); printf("0 : Retour\n"); printf("Votre choix : "); if(scanf("%d",&choixModeTransfert) < 1){ /* Erreur saisie */ printf("ERREUR : votre saisie est incorrecte \n\n"); while ( ((c = getchar()) != '\n') && c != EOF); /* on vide le buffer */ }else{ while ( ((c = getchar()) != '\n') && c != EOF); /* On teste que l'utiliateur est bien saisi 1 ou 2 ou 0 */ switch (choixModeTransfert){ case 1: /* Passage en mode bloc */ changerMode('B'); choixModeTransfert = 0; break; case 2: /* Passage en mode flux */ changerMode('S'); choixModeTransfert = 1; break; default: /* Erreur saisie */ printf("Votre choix est incorrect\n"); } } }while(choixModeTransfert != 0 && choixModeTransfert != 1); break; case 4: printf("Saisir le nom du fichier que vous voulez reprendre : \n"); /* On va lire le nom du fichier au clavier */ fgets(nomFichier,100,stdin); fflush(stdin); /* on vide le buffer */ /* On verifie qu'on a bien lu quelque chose */ if(nomFichier != NULL){ /* On passe en mode bloc */ choixModeTransfert = 0; /* On reprend le transfert */ repriseTelechargement(nomFichier); } break; case 0: /* Quitter l'application */ Emission("QUIT\n"); printf("%s",Reception()); Terminaison(); termine = TRUE; break; default: /* Erreur saisie */ printf("ERREUR : votre saisie est incorrecte \n\n"); break; } } }while(termine != TRUE); /* On ferme l'application */ printf("Fin du programme, au revoir\n"); } return 0; }