diff --git a/tsock_v0.c b/tsock_v0.c new file mode 100644 index 0000000..8ed9d45 --- /dev/null +++ b/tsock_v0.c @@ -0,0 +1,229 @@ +/*test */ +/* librairie standard ... */ +#include +/* pour getopt */ +#include +/* déclaration des types de base */ +#include +/* constantes relatives aux domaines, types et protocoles */ +#include +/* constantes et structures propres au domaine UNIX */ +#include +/* constantes et structures propres au domaine INTERNET */ +#include +/* structures retournées par les fonctions de gestion de la base de +données du réseau */ +#include +/* pour les entrées/sorties */ +#include +/* pour la gestion des erreurs */ +#include + +#define DEFAULTPORT 9000 +#define MSG_LENGTH 10 + +void usage(char* prog) { + printf("usage: %s [-p|-s][-u][-n ##]\n", prog); +} + +void construire_message(char* message, char motif, int lg) { + for (int i = 0; i < lg; ++i) { + message[i] = motif; + } + message[lg] = '\0'; +} + +void recvudp(int sock, char* buffer, int buf_len, void* addr, unsigned int addr_len) { + int lg_recv = recvfrom(sock, buffer, buf_len, 0, (struct sockaddr*) addr, &addr_len); + if (lg_recv == -1) { + perror("Message could not be recieved, Error: "); + exit(1); + } else if (lg_recv < buf_len) { + fprintf(stderr, "Only %i from %i characters have been reviewed.", lg_recv, buf_len); + exit(1); + } else { + buffer[lg_recv] = '\0'; + printf("message revieved: %s\n", buffer); + } +} + +void sendudp(int sock, char* message, int msg_len, void* addr, unsigned int addr_len) { + int lg_sent = sendto(sock, message, msg_len, 0, (struct sockaddr*) addr, addr_len); + if (lg_sent == -1) { + perror("Message could not be sent, Error: "); + exit(1); + } else if (lg_sent < MSG_LENGTH) { + fprintf(stderr, "Only %i from %i characters have been sent.", lg_sent, MSG_LENGTH); + exit(1); + } + printf("message sent: %s\n", message); +} + +void afficher_message(char* message, int lg) { + message[lg] = '\0'; + printf("message construit: %s", message); +} + +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 */ + char* hostname; + int protocole = 0; /* 0=tcp, 1=udp */ + int sock; + char* message; + struct hostent *hp; + struct sockaddr_in addr_local; + struct sockaddr_in addr_distant; + while ((c = getopt(argc, argv, "hu:pn:s")) != -1) { + switch (c) { + case 'h': + usage(argv[0]); + return 0; + case 'p': + if (source == 1) { + usage(argv[0]); + /* printf("usage: cmd [-p|-s][-n ##]\n"); */ + exit(1); + } + source = 0; + break; + + case 's': + if (source == 0) { + usage(argv[0]); + /* printf("usage: cmd [-p|-s][-n ##]\n"); */ + exit(1) ; + } + source = 1; + break; + + case 'n': + nb_message = atoi(optarg); + break; + + case 'u': + protocole = 1; + printf("%s\n", optarg); + hostname = optarg; + /* hostname = malloc((strlen(optarg) + 1) * sizeof(char)); */ + /* strcpy(hostname, optarg); */ + break; + + default: + usage(argv[0]); + /* printf("usage: cmd [-p|-s][-n ##]\n"); */ + break; + } + } + + if (source == -1) { + usage(argv[0]); + /* printf("usage: cmd [-p|-s][-n ##]\n"); */ + exit(1) ; + } + + if (source == 1) + printf("on est dans le source\n"); + else + printf("on est dans le puits\n"); + + if (nb_message != -1) { + if (source == 1) + printf("nb de tampons à envoyer : %d\n", nb_message); + else + printf("nb de tampons à recevoir : %d\n", nb_message); + } else { + if (source == 1) { + nb_message = 10 ; + printf("nb de tampons à envoyer = 10 par défaut\n"); + } else { + // changed envoyer to recevoir + printf("nb de tampons à recevoir = infini\n"); + } + + } + /* protocole = 0 (udp) 1(tcp) */ + if (!protocole) /* if (tcp activated) */ { + printf("TCP not implemented\n"); + return 0; + } else { + printf("using udp\n"); + } + /* if (protocole) /\* udp *\/ { */ + sock = socket(AF_INET, SOCK_DGRAM, 0); + /* } else { */ + /* sock = socket(AF_INET, SOCK_STREAM, 0); */ + /* } */ + if (sock < 0) { + perror("Error creating socket:"); + exit(1); + } + + printf("socket created\n"); + + memset(&addr_local, 0, sizeof(addr_local)); + addr_local.sin_family = AF_INET; + addr_local.sin_port = DEFAULTPORT; + addr_local.sin_addr.s_addr = INADDR_ANY; + + printf("address built\n"); + if (bind(sock, (struct sockaddr*) &addr_local, (sizeof(addr_local))) < 0 ) { + perror("Error while binding socket: "); + exit(1); + } + + + memset(&addr_distant, 0, sizeof(addr_local)); + addr_distant.sin_family = AF_INET; + addr_distant.sin_port = DEFAULTPORT; + printf("%s\n", hostname); + hp = gethostbyname(hostname); + if (hp == NULL) { + printf("hosname not found\n"); + /* herror("Error: "); */ + exit(1); + } + printf("hostname found\n"); + + memcpy(&addr_distant.sin_addr.s_addr, hp->h_addr, hp->h_length); + + printf("socket bound\n"); + + message = malloc((MSG_LENGTH + 1) * sizeof(char)); + if (source) { + construire_message(message, 'a', MSG_LENGTH); + if (nb_message < 0) { + while (1) { + sendudp(sock, message, MSG_LENGTH, &addr_distant, sizeof(addr_distant)); + } + } else { + for (int i = 0; i < nb_message; ++i) { + sendudp(sock, message, MSG_LENGTH, &addr_distant, sizeof(addr_distant)); + } + } + + } else { + if (nb_message < 0) { + while (1) { + recvudp(sock, message, MSG_LENGTH, &addr_distant, sizeof(addr_distant)); + } + } else { + for (int i = 0; i < nb_message; ++i) { + recvudp(sock, message, MSG_LENGTH, &addr_distant, sizeof(addr_distant)); + } + } + printf("puit not implemented\n"); + } + + + if (close(sock) < 0) { + perror("Error closing socket:"); + exit(1); + } + return 0; +} +