123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387 |
- /* 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 3 alpha - NON COMPLETE
- */
-
- ///////////////////////////////////////////////////////////
-
- // 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\n");
- }
-
- /// Affiche erreur connexion
- void err_conn(){
- printf("\n[-] Erreur lors de la connexion serveur/client\n");
- }
-
- ///////////////////////////////////////////////////////////
-
-
- // Given functions
- void construire_message(char *message, char motif, int lg, int numero) {
- int i;
- char str[5];
- for (i=0;i<5;++i) str[i] = '-';
- sprintf(str, "%5d", numero);
- for (i=0;i<lg;i++) message[i] = motif;
- for (i=0;i<5;++i) message[i] = str[i];
- }
-
- 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_list[0], 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, i);
- afficher_message(pmesg, l_msg);
- sendto(s_udp,
- pmesg,
- strlen(pmesg),
- 0,
- (const struct sockaddr *) &servaddr,
- sizeof(servaddr)
- );
- c++;
- if (c >= '{') c = 'a';
- }
-
- 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){
- // Création du socket TCP
- printf("[+] Création du socket local...");
- int s_tcp = socket(AF_INET,SOCK_STREAM, 0);
-
- if (s_tcp == -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_list[0], hp->h_length);
- servaddr.sin_port = PORT;
- printf("Ok!\n");
-
- if (connect(s_tcp, (const struct sockaddr *)&servaddr, sizeof(servaddr)) < 0){
- err_conn();
- return 1;
- }
-
-
- printf("[+] Envoi des messages...\n");
-
- // 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, i);
- afficher_message(pmesg, l_msg);
- if (write(s_tcp, pmesg, l_msg) < 0){
- err_conn();
- return 1;
- }
- c++;
- if (c >= '{') c = 'a';
- }
-
- close(s_tcp);
-
- return 0;
- }
-
- int puit_TCP(int PORT, int nb_message, int l_msg){
- // Création du socket TCP
- printf("[+] Création du socket local...");
- int s_tcp = socket(AF_INET,SOCK_STREAM, 0);
-
- if (s_tcp == -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_tcp, (struct sockaddr *)&servaddr, sizeof(servaddr)) != 0) {
- err_socks();
- return 1;
- }
- printf("[+] Bind ok !\n");
-
- if (listen(s_tcp, 5) != 0){
- err_conn();
- return 1;
- }
- printf("[+] Listening on port %d\n", PORT);
-
- int s_conn, l_recpt, msg_count = 1;
- int lg_cliaddr = sizeof(cliaddr);
-
- if ((s_conn = accept(s_tcp, (struct sockaddr *)&cliaddr, &lg_cliaddr)) < 0){
- err_conn();
- return 1;
- }
- printf("[+] Connection accepted\n");
-
-
- int n;
- char buffer[l_msg];
-
- printf("[+] Waiting for messages...\n");
-
- while (msg_count <= nb_message || nb_message == -1){
- if ((l_recpt = read(s_conn, buffer, sizeof(buffer))) < 0){
- err_conn();
- return 1;
- }
- if (l_recpt > 0){
- printf("[>] Reception du message n°%d : %s\n", msg_count, buffer);
-
- n = 0;
- msg_count++;
- bzero(buffer, l_msg);
- }
- }
-
- return 0;
- }
-
- ///////////////////////////////////////////////////////////
-
- /// 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) + 5;
- break;
-
- 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;
- }
|