diff --git a/2A/systeme/tp/7_tp/client.c b/2A/systeme/tp/7_tp/client.c index 882350a..dccad7e 100644 --- a/2A/systeme/tp/7_tp/client.c +++ b/2A/systeme/tp/7_tp/client.c @@ -1,57 +1,91 @@ -// #include -// #include -// #include -// #include -// #include +#include +#include +#include +#include +#include + +#include /* pour read(2)/write(2) */ + +#include /* pour getaddrinfo*/ +#include /* pour memset */ + +#include /* pour inet_ntop */ + +#define LINE_MAX 1024 /* taille MAX en réception */ + +void usage() { + fprintf(stderr,"usage : client hostname port\n"); + exit(1); +} -// #include /* pour getaddrinfo */ -// #include /* pour memset */ +int main(int argc, char **argv) { + int s, ret; + + struct addrinfo hints, *result; + + char msg[LINE_MAX]; + char response[LINE_MAX]; + + + /* Vérification des arguments */ + if(argc!=3) { + fprintf(stderr,"Erreur : Nb args !\n"); + usage(); + } + memset(&hints, 0, sizeof(struct addrinfo)); + hints.ai_flags = 0; + hints.ai_family = AF_UNSPEC; /* Allow IPv4 or IPv6 */ + hints.ai_socktype = SOCK_STREAM; /* socket TCP (flux) */ + hints.ai_protocol = 0; /* Any protocol */ + hints.ai_canonname = NULL; + hints.ai_addr = NULL; + hints.ai_next = NULL; + + ret = getaddrinfo(argv[1], argv[2], &hints, &result); + if (ret != 0) { + fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(ret)); + exit(EXIT_FAILURE); + } + /* Création de la socket IPv4/IPv6 */ + if((s=socket(result->ai_family, result->ai_socktype, + result->ai_protocol))==-1) { + perror("socket"); exit(1); + } + + /* Connexion au serveur */ + if(connect(s, result->ai_addr, result->ai_addrlen)) { + perror("connect"); exit(1); + } + + freeaddrinfo(result); // si result ne sert plus -// #include /* pour inet_ntop */ - -// #define DGRAM_MAX 1024 /* taille MAX en réception */ - -// void usage() { -// fprintf(stderr,"usage: client hostname port\n"); -// exit(1); -// } - -// int main(int argc, char **argv) { -// struct sockaddr_storage src_addr; -// int s, ret; -// stocklen_t len_src_addr; - -// struct addrinfo hints, *result; - -// char response[DGRAM_MAX]; -// /* Vérification des arguments */ -// if(argc!=3){ -// fprintf(stderr,"Erreur : Nb args !"); -// usage(); -// } -// memset(&hints, 0, sizeof(struct addrinfo)); -// hints.ai_flags = 0; -// hints.ai_family = AF_UNSPEC; /* Allow IPv4 or IPv6 */ -// hints.ai_socktype = SOCK_DGRAM; /* Datagram socket */ -// hints.ai_protocol = 0; /* Any protocol */ -// hints.ai_canonname = NULL; -// hints.ai_addr = NULL; -// hints.ai_next = NULL; - -// ret = getaddrinfo(argv[1], argv[2], &hints, &result); -// if(ret != 0) { -// fprintf(stderr, "getaddrinfo : %s\n", gai_strerror(ret)); -// exit(EXIT_FAILURE); -// } -// /* Création de la socket IPv4/IPv6 */ -// if((s=socket(result->ai_family, result->ai_socktype, result->ai_protocol))==-1) { -// perror("socket"); exit(errno); -// } -// /* Envoi du message */ -// if(sendto(s, argv[3], strlen(argv[3]), 0, result->ai_addr, result->ai_addrlen)==-1) { -// perror("sendto"); exit(errno); -// } -// freeaddrinfo(result); -// close(s); -// return 0; -// } \ No newline at end of file + while(fgets(msg, LINE_MAX, stdin) != NULL) { + + msg[strlen(msg)-1]=0; /* retire '\n' final */ + + /* Émission */ + if(send(s, msg, strlen(msg)+1, 0) != strlen(msg)+1) { + perror("send"); exit(1); + } + + /* Attente et lecture de la réponse */ + ret=recv(s, response, LINE_MAX, 0); + + if(ret==0) { + fprintf(stderr, "Déconnexion du serveur !\n"); + exit(1); + } + + else if(ret == -1) { + perror("recv"); exit(1); + } + /* Traitement de la réponse */ + puts(response); + } + + if(close(s)==-1) { + perror("close"); exit(1); + } + + return 0; +} \ No newline at end of file diff --git a/2A/systeme/tp/7_tp/serveur b/2A/systeme/tp/7_tp/client1 similarity index 90% rename from 2A/systeme/tp/7_tp/serveur rename to 2A/systeme/tp/7_tp/client1 index e430676..29e9953 100755 Binary files a/2A/systeme/tp/7_tp/serveur and b/2A/systeme/tp/7_tp/client1 differ diff --git a/2A/systeme/tp/7_tp/client b/2A/systeme/tp/7_tp/client2 similarity index 90% rename from 2A/systeme/tp/7_tp/client rename to 2A/systeme/tp/7_tp/client2 index 732bd5d..66a602d 100755 Binary files a/2A/systeme/tp/7_tp/client and b/2A/systeme/tp/7_tp/client2 differ diff --git a/2A/systeme/tp/7_tp/client2.c b/2A/systeme/tp/7_tp/client2.c deleted file mode 100644 index 0494a50..0000000 --- a/2A/systeme/tp/7_tp/client2.c +++ /dev/null @@ -1,67 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -#define BUFFER_SIZE 1024 - -void usage() { - fprintf(stderr, "Usage: client hostname port\n"); - exit(1); -} - -int main(int argc, char **argv) { - if (argc != 3) { - fprintf(stderr, "Erreur : Nombre incorrect d'arguments !\n"); - usage(); - } - - const char *hostname = argv[1]; - int port = atoi(argv[2]); - - int clientSocket = socket(AF_INET6, SOCK_STREAM, 0); - if (clientSocket == -1) { - perror("Error creating client socket"); - exit(EXIT_FAILURE); - } - - struct sockaddr_in6 serverAddress; - memset(&serverAddress, 0, sizeof(serverAddress)); - serverAddress.sin6_family = AF_INET6; - serverAddress.sin6_port = htons(port); - - // if (inet_pton(AF_INET6, hostname, &(serverAddress.sin6_addr)) <= 0) { - // perror("Error converting IP address"); - // close(clientSocket); - // exit(EXIT_FAILURE); - // } - - if (connect(clientSocket, (struct sockaddr *)&serverAddress, sizeof(serverAddress)) == -1) { - perror("Error connecting to server"); - close(clientSocket); - exit(EXIT_FAILURE); - } - - printf("Connected to server. Receiving file...\n"); - - FILE *file = fopen("received_file.txt", "wb"); - if (!file) { - perror("Error opening file for writing"); - close(clientSocket); - exit(EXIT_FAILURE); - } - - unsigned char buffer[BUFFER_SIZE]; - size_t bytesRead; - while ((bytesRead = recv(clientSocket, buffer, BUFFER_SIZE, 0)) > 0) { - fwrite(buffer, 1, bytesRead, file); - } - - fclose(file); - close(clientSocket); - - return 0; -} diff --git a/2A/systeme/tp/7_tp/client2v2.c b/2A/systeme/tp/7_tp/client2v2.c new file mode 100644 index 0000000..1020d3b --- /dev/null +++ b/2A/systeme/tp/7_tp/client2v2.c @@ -0,0 +1,89 @@ +#include +#include +#include +#include +#include + +#include /* pour read(2)/write(2) */ + +#include /* pour getaddrinfo*/ +#include /* pour memset */ + +#include /* pour inet_ntop */ + +#define LINE_MAX 1024 /* taille MAX en réception */ + +void usage() { + fprintf(stderr,"usage : client hostname port\n"); + exit(1); +} + +int main(int argc, char **argv) { + int s, ret; + + struct addrinfo hints, *result; + + char msg[LINE_MAX]; + char response[LINE_MAX]; + + + /* Vérification des arguments */ + if(argc!=3) { + fprintf(stderr,"Erreur : Nb args !\n"); + usage(); + } + memset(&hints, 0, sizeof(struct addrinfo)); + hints.ai_flags = 0; + hints.ai_family = AF_UNSPEC; /* Allow IPv4 or IPv6 */ + hints.ai_socktype = SOCK_STREAM; /* socket TCP (flux) */ + hints.ai_protocol = 0; /* Any protocol */ + hints.ai_canonname = NULL; + hints.ai_addr = NULL; + hints.ai_next = NULL; + + ret = getaddrinfo(argv[1], argv[2], &hints, &result); + if (ret != 0) { + fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(ret)); + exit(EXIT_FAILURE); + } + /* Création de la socket IPv4/IPv6 */ + if((s=socket(result->ai_family, result->ai_socktype, + result->ai_protocol))==-1) { + perror("socket"); exit(1); + } + + /* Connexion au serveur */ + if(connect(s, result->ai_addr, result->ai_addrlen)) { + perror("connect"); exit(1); + } + + freeaddrinfo(result); // si result ne sert plus + +// while(fgets(msg, LINE_MAX, stdin) != NULL) { + + // msg[strlen(msg)-1]=0; /* retire '\n' final */ + + // /* Émission */ + // if(send(s, "msg", strlen(msg)+1, 0) != strlen(msg)+1) { + // perror("send"); exit(1); + // } + + /* Attente et lecture de la réponse */ + while((ret=recv(s, response, LINE_MAX, 0))!=-1) { + if(ret==0) { + fprintf(stderr, "Déconnexion du serveur !\n"); + exit(1); + } + + else if(ret == -1) { + perror("recv"); exit(1); + } + puts(response); + } + + if(close(s)==-1) { + perror("close"); exit(1); + } + + return 0; +} \ No newline at end of file diff --git a/2A/systeme/tp/7_tp/received_file.txt b/2A/systeme/tp/7_tp/received_file.txt deleted file mode 100644 index 882350a..0000000 --- a/2A/systeme/tp/7_tp/received_file.txt +++ /dev/null @@ -1,57 +0,0 @@ -// #include -// #include -// #include -// #include -// #include - -// #include /* pour getaddrinfo */ -// #include /* pour memset */ - -// #include /* pour inet_ntop */ - -// #define DGRAM_MAX 1024 /* taille MAX en réception */ - -// void usage() { -// fprintf(stderr,"usage: client hostname port\n"); -// exit(1); -// } - -// int main(int argc, char **argv) { -// struct sockaddr_storage src_addr; -// int s, ret; -// stocklen_t len_src_addr; - -// struct addrinfo hints, *result; - -// char response[DGRAM_MAX]; -// /* Vérification des arguments */ -// if(argc!=3){ -// fprintf(stderr,"Erreur : Nb args !"); -// usage(); -// } -// memset(&hints, 0, sizeof(struct addrinfo)); -// hints.ai_flags = 0; -// hints.ai_family = AF_UNSPEC; /* Allow IPv4 or IPv6 */ -// hints.ai_socktype = SOCK_DGRAM; /* Datagram socket */ -// hints.ai_protocol = 0; /* Any protocol */ -// hints.ai_canonname = NULL; -// hints.ai_addr = NULL; -// hints.ai_next = NULL; - -// ret = getaddrinfo(argv[1], argv[2], &hints, &result); -// if(ret != 0) { -// fprintf(stderr, "getaddrinfo : %s\n", gai_strerror(ret)); -// exit(EXIT_FAILURE); -// } -// /* Création de la socket IPv4/IPv6 */ -// if((s=socket(result->ai_family, result->ai_socktype, result->ai_protocol))==-1) { -// perror("socket"); exit(errno); -// } -// /* Envoi du message */ -// if(sendto(s, argv[3], strlen(argv[3]), 0, result->ai_addr, result->ai_addrlen)==-1) { -// perror("sendto"); exit(errno); -// } -// freeaddrinfo(result); -// close(s); -// return 0; -// } \ No newline at end of file diff --git a/2A/systeme/tp/7_tp/server2 b/2A/systeme/tp/7_tp/server2 new file mode 100755 index 0000000..04152fa Binary files /dev/null and b/2A/systeme/tp/7_tp/server2 differ diff --git a/2A/systeme/tp/7_tp/server2.c b/2A/systeme/tp/7_tp/server2.c deleted file mode 100644 index 273851f..0000000 --- a/2A/systeme/tp/7_tp/server2.c +++ /dev/null @@ -1,88 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -#define BUFFER_SIZE 1024 - -void usage() { - fprintf(stderr, "Usage: serveur port fichier\n"); - exit(1); -} - -int main(int argc, char **argv) { - if (argc != 3) { - fprintf(stderr, "Erreur : Nombre incorrect d'arguments !\n"); - usage(); - } - - int port = atoi(argv[1]); - - int serverSocket = socket(AF_INET6, SOCK_STREAM, 0); - if (serverSocket == -1) { - perror("Error creating server socket"); - exit(EXIT_FAILURE); - } - - struct sockaddr_in6 serverAddress; - memset(&serverAddress, 0, sizeof(serverAddress)); - serverAddress.sin6_family = AF_INET6; - serverAddress.sin6_addr = in6addr_any; - serverAddress.sin6_port = htons(port); - - if (bind(serverSocket, (struct sockaddr *)&serverAddress, sizeof(serverAddress)) == -1) { - perror("Error binding server socket"); - close(serverSocket); - exit(EXIT_FAILURE); - } - - if (listen(serverSocket, 1) == -1) { - perror("Error listening on server socket"); - close(serverSocket); - exit(EXIT_FAILURE); - } - - printf("Server listening on port %d...\n", port); - - while (1) { - int clientSocket = accept(serverSocket, NULL, NULL); - if (clientSocket == -1) { - perror("Error accepting client connection"); - close(serverSocket); - exit(EXIT_FAILURE); - } - - printf("Client connected. Transferring file...\n"); - - FILE *file = fopen(argv[2], "rb"); - if (!file) { - perror("Error opening file for reading"); - close(clientSocket); - continue; // Move on to the next client - } - - // Send file content to client - unsigned char buffer[BUFFER_SIZE]; - size_t bytesRead; - while ((bytesRead = fread(buffer, 1, BUFFER_SIZE, file)) != 0) { - if (send(clientSocket, buffer, bytesRead, 0) == -1) { - perror("Error sending file content to client"); - fclose(file); - close(clientSocket); - continue; - } - } - - printf("File transfer complete.\n"); - - fclose(file); - close(clientSocket); - } - - close(serverSocket); - - return 0; -} diff --git a/2A/systeme/tp/7_tp/server2v2.c b/2A/systeme/tp/7_tp/server2v2.c new file mode 100644 index 0000000..fb73bab --- /dev/null +++ b/2A/systeme/tp/7_tp/server2v2.c @@ -0,0 +1,131 @@ +#include +#include +#include +#include +#include +#include /* pour read(2)/write(2) */ + +#include +#include /* pour memset */ + +#include /* pour toupper */ + +#include /* pour inet_ntop */ + +#define REQUEST_MAX 1024 /* taille MAX en réception */ +#define BUFFER_SIZE 1024 + +void usage() { + fprintf(stderr,"usage : serveur port fichier\n"); + exit(1); +} + +int main(int argc, char **argv) { + int s, sock, ret; + + struct addrinfo hints, *result; + + struct sockaddr_storage src_addr; + socklen_t len_src_addr; + + char request[REQUEST_MAX]; + + /* Vérification des arguments */ + if(argc!=3) { + fprintf(stderr,"Erreur : Nb args !\n"); + usage(); + } + memset(&hints, 0, sizeof(struct addrinfo)); + hints.ai_flags = AI_PASSIVE; /* Equiv INADDR_ANY */ + hints.ai_family = AF_INET6; /* Allow IPv4 or IPv6 */ + hints.ai_socktype = SOCK_STREAM; /* Flux => TCP */ + hints.ai_protocol = 0; /* Any protocol */ + hints.ai_canonname = NULL; + hints.ai_addr = NULL; + hints.ai_next = NULL; + + ret = getaddrinfo(NULL, argv[1], &hints, &result); + if (ret != 0) { + fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(ret)); + exit(EXIT_FAILURE); + } + + /* Création de la socket IPv4/IPv6 */ + if((s=socket(result->ai_family, result->ai_socktype, + result->ai_protocol))==-1) { + perror("socket"); exit(1); + } + + /* Attachement de la socket */ + + if (bind(s, result->ai_addr, result->ai_addrlen) == -1) { + perror("bind"); exit(1); + } + + freeaddrinfo(result); + + /* définition de la taille de la file d'attente */ + + if(listen(s, 5)) { + perror("listen"); exit(1); + } + + FILE *file = fopen(argv[2], "rb"); + if (!file) { + perror("Pb fichier, impossible ouverture !"); + close(sock); + exit(errno);// Move on to the next client + } + + while(1) { /* boucle du serveur */ + + /* Attente d'une connexion */ + + puts("En attente de connexion..."); + + len_src_addr=sizeof src_addr; + if((sock=accept(s, (struct sockaddr *)&src_addr, + &len_src_addr))==-1) { + perror("accept"); exit(1); // exit errno que si on s'en sert. + } + + puts("Connexion acceptée !"); + + rewind(file); + + /* boucle de traitement du client */ + + // while((ret=recv(sock, request, REQUEST_MAX,0))>0) { + + // request[ret]=0; + + // /* traitement de la requête(passage en majuscule) */ + // { + // int i=0; + // Send file content to client + unsigned char buffer[BUFFER_SIZE]; + size_t bytesRead; + while ((bytesRead = fread(buffer, 1, BUFFER_SIZE, file)) != 0) { + if (send(sock, buffer, bytesRead, 0) == -1) { + perror("Pb impossible d'envoyer le fichier au client"); + fclose(file); + close(sock); + continue; + } + } + // } + // } /* fin de la boucle de traitement du client */ + + if(close(sock)==-1 && fclose(file)==-1) { + perror("close"); exit(errno); + } + + fprintf(stderr, "Fin de connexion !\n"); + if(ret==-1) { + perror("recv"); + } + + } /* fin boucle principale du serveur */ + + return 0; +} \ No newline at end of file diff --git a/2A/systeme/tp/7_tp/serveur.c b/2A/systeme/tp/7_tp/serveur.c index 3566871..149acb7 100644 --- a/2A/systeme/tp/7_tp/serveur.c +++ b/2A/systeme/tp/7_tp/serveur.c @@ -1,78 +1,121 @@ -// #include -// #include -// #include -// #include -// #include -// #include -// #include /* pourmemset */ -// #include /* pourtoupper */ -// #include /* pour inet_ntop */ -// #define DGRAM_MAX 1024 /* taille MAX en réception */ -// void usage() { -// fprintf(stderr,"usage: serveur port fichier\n"); -// exit(1); -// } -// int main(int argc, char **argv) { -// int s, ret; -// socklen_t len_src_addr; +#include +#include +#include +#include +#include +#include /* pour read(2)/write(2) */ + +#include +#include /* pour memset */ + +#include /* pour toupper */ + +#include /* pour inet_ntop */ + +#define REQUEST_MAX 1024 /* taille MAX en réception */ + +void usage() { + fprintf(stderr,"usage : serveur port\n"); + exit(1); +} -// struct addrinfo hints, *result; -// struct sockaddr_storage src_addr; +int main(int argc, char **argv) { + int s, sock, ret; + + struct addrinfo hints, *result; + + struct sockaddr_storage src_addr; + socklen_t len_src_addr; + + char request[REQUEST_MAX]; + + /* Vérification des arguments */ + if(argc!=2) { + fprintf(stderr,"Erreur : Nb args !\n"); + usage(); + } + memset(&hints, 0, sizeof(struct addrinfo)); + hints.ai_flags = AI_PASSIVE; /* Equiv INADDR_ANY */ + hints.ai_family = AF_INET6; /* Allow IPv4 or IPv6 */ + hints.ai_socktype = SOCK_STREAM; /* Flux => TCP */ + hints.ai_protocol = 0; /* Any protocol */ + hints.ai_canonname = NULL; + hints.ai_addr = NULL; + hints.ai_next = NULL; + + ret = getaddrinfo(NULL, argv[1], &hints, &result); + if (ret != 0) { + fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(ret)); + exit(EXIT_FAILURE); + } -// char request[DGRAM_MAX]; + /* Création de la socket IPv4/IPv6 */ + if((s=socket(result->ai_family, result->ai_socktype, + result->ai_protocol))==-1) { + perror("socket"); exit(1); + } + + /* Attachement de la socket */ + + if (bind(s, result->ai_addr, result->ai_addrlen) == -1) { + perror("bind"); exit(1); + } + + freeaddrinfo(result); + + /* définition de la taille de la file d'attente */ + + if(listen(s, 5)) { + perror("listen"); exit(1); + } -// /* Vérificationd e sarguments */ -// if(argc!=2){ -// fprintf(stderr,"Erreur : Nb args !"); -// usage(); -// } -// memset(&hints, 0, sizeof(struct addrinfo)); -// hints.ai_flags = AI_PASSIVE; /* For wildcard I P address */ -// hints.ai_family = AF_INET6; /* AllowIPv4o rIPv6 */ -// hints.ai_socktype = SOCK_DGRAM; /* Datagramsocket */ -// hints.ai_protocol = 0; /* Any protocol */ -// hints.ai_canonname = NULL; -// hints.ai_addr = NULL; -// hints.ai_next = NULL; + while(1) { /* boucle du serveur */ + + /* Attente d'une connexion */ + + puts("En attente de connexion..."); + + len_src_addr=sizeof src_addr; + if((sock=accept(s, (struct sockaddr *)&src_addr, + &len_src_addr))==-1) { + perror("accept"); exit(1); + } + + puts("Connexion acceptée !"); -// ret = getaddrinfo (NULL, argv[1], &hints, &result); -// if(ret != 0) { -// fprintf(stderr, "getaddrinfo : %s\n", gai_strerror(ret)); -// exit(EXIT_FAILURE); -// } -// /* Créationd de la socket IPv4/IPv6 */ -// if((s=socket(result->ai_family, result->ai_socktype, result->ai_protocol))==-1) { -// perror("socket"); exit(errno); -// } -// /* Attachementd el asocket */ -// if(bind(s, result->ai_addr, result->ai_addrlen) == -1) { -// perror("bind"); exit(errno); -// } -// freeaddrinfo (result); -// while(1) { -// /* Attente et lecture d'une requête */ -// len_src_addr = sizeof src_addr; -// if((ret=recvfrom(s, request, DGRAM_MAX-1, 0, (struct sockaddr*) &src_addr, &len_src_addr))==-1) { -// perror("recvfrom"); exit(1); -// } -// request[ret] = 0; - -// puts(request); - -// /* Traitement de la requête (passage en majuscule) */ -// { -// int i=0; -// while(request[i]) { -// request[i]=toupper(request[i]); -// ++i; -// } -// } - -// /* Envoi de la réponse */ -// if(sendto(s, request, strlen(request), 0, (struct sockaddr*) &src_addr, len_src_addr)==-1) { -// perror("sendto"); exit(1); -// } -// } -// close(s); -// return 0; -// } \ No newline at end of file + /* boucle de traitement du client */ + + while((ret=recv(sock, request, REQUEST_MAX,0))>0) { + + request[ret]=0; + + /* traitement de la requête(passage en majuscule) */ + { + int i=0; + + while(request[i]) { + request[i]=toupper(request[i]); + ++i; + } + } + /* Émission de la réponse */ + + if(send(sock, request, strlen(request)+1,0) != + strlen(request)+1) { + perror("send"); exit(1); + } + } /* fin de la boucle de traitement du client */ + + if(close(sock)==-1) { + perror("close"); exit(1); + } + + fprintf(stderr, "Fin de connexion !\n"); + if(ret==-1) { + perror("recv"); + } + + } /* fin boucle principale du serveur */ + + return 0; +} \ No newline at end of file diff --git a/2A/systeme/tp/7_tp/serveur1 b/2A/systeme/tp/7_tp/serveur1 new file mode 100755 index 0000000..027f84a Binary files /dev/null and b/2A/systeme/tp/7_tp/serveur1 differ