123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274 |
- /* librairie standard ... */
- #include <stdlib.h>
- /* pour getopt */
- #include <unistd.h>
- /* déclaration des types de base */
- #include <sys/types.h>
- /* constantes relatives aux domaines, types et protocoles */
- #include <sys/socket.h>
- /* constantes et structures propres au domaine UNIX */
- #include <sys/un.h>
- /* constantes et structures propres au domaine INTERNET */
- #include <netinet/in.h>
- /* structures retournées par les fonctions de gestion de la base de
- données du réseau */
- #include <netdb.h>
- /* pour les entrées/sorties */
- #include <stdio.h>
- /* pour la gestion des erreurs */
- #include <errno.h>
-
- /*
- TP AIPS
- Version 1 - Fonctionnelle
- */
-
- ///////////////////////////////////////////////////////////
-
- // Fonctions d'erreurs
- /// Afficher l'usage et quitte
- void err_args() {
- printf("[!] Usage: cmd [-u][-p|-s][-n ##][-l ##]\n");
- exit(EXIT_FAILURE);
- }
-
- /// Affiche erreur socket
- void err_socks(){
- printf("\n[-] Erreur lors de la création/affectation du socket");
- }
-
- /// Affiche erreur connexion
- void err_conn(){
- printf("\n[-] Erreur lors de la connexion serveur/client");
- }
-
- ///////////////////////////////////////////////////////////
-
-
- // Given functions
- void construire_message(char *message, char motif, int lg) {
- int i;
- for (i=0;i<lg;i++) message[i] = motif;
- }
-
- void afficher_message(char *message, int lg) {
- int i;
- printf("[+] Message construit : ");
- for (i=0;i<lg;i++) printf("%c", message[i]);
- printf("\n");
- }
-
- ///////////////////////////UDP/////////////////////////////
-
- int source_UDP(char *HOSTNAME, int PORT, int nb_message, int l_msg) {
- // Création du socket UDP
- printf("[+] Création du socket local...");
- int s_udp = socket(AF_INET,SOCK_DGRAM, 0);
-
- if (s_udp == -1){
- err_socks();
- return 1;
- } else printf("Ok!\n");
-
-
- // Création du socket distant
- printf("[+] Création du socket distant...");
- struct sockaddr_in servaddr;
- memset(&servaddr, 0, sizeof(servaddr));
- struct hostent *hp ;
-
- // Résolution du nom
- if ((hp = gethostbyname(HOSTNAME)) == NULL) {
- err_conn();
- return 1;
- }
-
- // Creation de la struct du socket distant
- servaddr.sin_family = AF_INET;
- memcpy((char*)&(servaddr.sin_addr.s_addr), hp->h_addr, hp->h_length);
- servaddr.sin_port = PORT;
- printf("Ok!\n");
-
- printf("[+] Envoi des messages à %s:%d...\n", HOSTNAME, PORT);
-
- // TEST
- char *pmesg = malloc(l_msg*sizeof(char));
- char c = 'a';
-
- // Création des messages à envoyer et envoi
- for (int i = 1; i <= nb_message; i++){
- construire_message(pmesg, c, l_msg);
- afficher_message(pmesg, l_msg);
- sendto(s_udp,
- pmesg,
- strlen(pmesg),
- 0,
- (const struct sockaddr *) &servaddr,
- sizeof(servaddr)
- );
- c++;
- }
-
- return 0;
- }
-
- int puit_UDP(int PORT, int nb_message, int l_msg) {
- // Création du socket UDP
- printf("[+] Création du socket local...");
- int s_udp = socket(AF_INET,SOCK_DGRAM, 0);
-
- if (s_udp == -1){
- err_socks();
- return 1;
- } else printf("Ok!\n");
-
- struct sockaddr_in servaddr, cliaddr;
- memset(&servaddr, 0, sizeof(servaddr));
- memset(&cliaddr, 0, sizeof(cliaddr));
-
- servaddr.sin_family = AF_INET;
- servaddr.sin_addr.s_addr = INADDR_ANY;
- servaddr.sin_port = PORT;
-
- if ( bind(s_udp, (const struct sockaddr *)&servaddr, sizeof(servaddr)) < 0 ) {
- err_socks();
- return 1;
- }
- printf("[+] Bind ok !\n");
-
- int n;
- int len;
- int msg_count = 0;
- char buffer[l_msg];
-
- printf("[+] Waiting for messages...\n");
-
- while (msg_count >= nb_message || nb_message != -1){
- n = recvfrom(s_udp, (char *)buffer, l_msg,
- MSG_WAITALL, (struct sockaddr *) &cliaddr,
- &len);
- buffer[n] = '\0';
- printf("[>] Reception du message n°%d : %s\n", msg_count, buffer);
-
- n = 0;
- msg_count++;
- }
-
-
-
- return 0;
- }
-
- ////////////////////////////TCP/////////////////////////////
-
- int source_TCP(char *HOSTNAME, int PORT, int nb_message, int l_msg){
-
- return 1;
- }
-
- int puit_TCP(int PORT, int nb_message, int l_msg){
-
- return 1;
- }
-
- ///////////////////////////////////////////////////////////
-
- /// Main entry
- int main (int argc, char **argv)
- {
- int c;
- extern char *optarg;
- extern int optind;
- int nb_message = -1; /* Nb de messages à envoyer ou à recevoir, par défaut : 10 en émission, infini en réception */
- int source = -1; /* 0 = puits, 1 = source */
- int tcp = 1; /* 0 = UDP, 1 = TCP */
- int l_msg = 30; /* longueur du message, en octet. Defaut : 30. */
-
- while ((c = getopt(argc, argv, "pn:sul:")) != -1) {
- switch (c) {
- case 'p':
- if (source == 1) {
- err_args();
- }
- source = 0;
- break;
-
- case 's':
- if (source == 0) {
- err_args();
- }
- source = 1;
- break;
-
- case 'n':
- nb_message = atoi(optarg);
- break;
-
- case 'u':
- tcp = 0;
- break;
-
- case 'l':
- l_msg = atoi(optarg);
-
- default:
- err_args();
- break;
- }
- }
-
- int PORT = atoi(argv[argc-1]);
- //PORT = htons(PORT);
-
- if (source == -1) {
- err_args();
- }
-
- if (tcp)
- printf("[+] On utilise le protocol TCP\n");
- else
- printf("[+] On utilise le protocol UDP\n");
-
-
- char* HOSTNAME = "";
- if (source == 1){
- printf("[+] On est dans la source\n");
- HOSTNAME = argv[argc-2];
- }
- else
- printf("[+] On est dans le puit\n");
-
- if (nb_message != -1) {
- if (source == 1)
- printf("[+] Nombre de tampons à envoyer : %d\n", nb_message);
- else
- printf("[+] Nombre de tampons à recevoir : %d\n", nb_message);
- } else {
- if (source == 1) {
- nb_message = 10 ;
- printf("[~] Nombre de tampons à envoyer = 10 par défaut\n");
- }
- else
- printf("[+] Nombre de tampons à envoyer = infini\n");
- }
-
- if (l_msg == 30)
- printf("[~] Longueur des messages à envoyer/recevoir : 30 par défaut\n");
- else
- printf("[+] Nombre de tampons à envoyer/recevoir : %d \n", l_msg);
-
- int s = 1;
-
- // Choose the right function
- if (tcp){
- if (source) s = source_TCP(HOSTNAME, PORT, nb_message, l_msg);
- else s = puit_TCP(PORT, nb_message, l_msg);
- }
- else {
- if (source) s = source_UDP(HOSTNAME, PORT, nb_message, l_msg);
- else s = puit_UDP(PORT, nb_message, l_msg);
- }
-
- return s;
- }
|