commit e4bd9c64c957e47f4b4a3601aeb432d20e25e158 Author: Flavien Haas Date: Mon Sep 23 14:37:16 2019 +0200 initial commit diff --git a/TP 9 Sockets C.zip b/TP 9 Sockets C.zip new file mode 100644 index 0000000..1d0e529 Binary files /dev/null and b/TP 9 Sockets C.zip differ diff --git a/TP3_sockets_echo-2.pdf b/TP3_sockets_echo-2.pdf new file mode 100644 index 0000000..5b12991 Binary files /dev/null and b/TP3_sockets_echo-2.pdf differ diff --git a/client_echo.c b/client_echo.c new file mode 100755 index 0000000..a9719a2 --- /dev/null +++ b/client_echo.c @@ -0,0 +1,87 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define LG_BUFFER 1024 + +int main (int argc, char * argv[]) { + struct sockaddr_in adresse; + int sock; + + char buffer [LG_BUFFER]; + int nb_lus; + + // Serveur auquel on se connecte + char * hote = "127.0.0.1"; + // Port du serveur sur lequel on se connecte + int port = 60000; + + struct hostent * hostent; + struct servent * servent; + + // Vider la structure adresse + memset(&adresse, 0, sizeof(struct sockaddr_in)); + + // Donner l'adresse du serveur à la structure adresse + if (inet_aton(hote, & (adresse.sin_addr)) == 0) { + if ((hostent = gethostbyname(hote)) == NULL) { + printf("Erreur : hote %s inconnu \n", hote); + return -1; + } + adresse.sin_addr.s_addr = ((struct in_addr *) (hostent->h_addr))->s_addr; + } + + // Donner un numero de port à la structure adresse + adresse.sin_port = htons(port); + + // Donner la famille de socket à la structure adresse + adresse.sin_family = AF_INET; + + // Créer la socket nommée sock + if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) { + printf("Erreur : socket\n"); + exit(EXIT_FAILURE); + } + + // Etablir la connexion avec le serveur + if(connect(sock, (struct sockaddr *) & adresse, sizeof (struct sockaddr_in)) < 0 ) { + printf("Erreur : socket"); + return -1; + } + + while (1) { + // Lecture du clavier + if (fgets(buffer, 256, stdin) == NULL) + break; + + if (buffer[strlen(buffer) - 1] == '\n') + buffer[strlen(buffer) - 1] = '\0'; + + // Ecriture des données sur la socket + if (write(sock, buffer, strlen(buffer)) < 0 ) { + printf("Erreur : write\n"); + break; + } + + // Lecture de la réponse du serveur + if ((nb_lus = read(sock, buffer, LG_BUFFER)) == 0 ) { + break; + } + + if (nb_lus < 0) { + printf("Erreur : read\n"); + break; + } + + // Affichage de données recues, variable buffer + printf("%s\n", buffer); + } + + return EXIT_SUCCESS; +} diff --git a/serveur.o b/serveur.o new file mode 100755 index 0000000..e9b3068 Binary files /dev/null and b/serveur.o differ diff --git a/serveur_echo.c b/serveur_echo.c new file mode 100755 index 0000000..d4ac379 --- /dev/null +++ b/serveur_echo.c @@ -0,0 +1,178 @@ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int cree_socket_stream (const char * nom_hote, const int num_port, const char * nom_proto); +int affiche_adresse_socket (int sock); +int serveur_tcp (void); +void traite_connexion (int sock); + +int cree_socket_stream (const char * nom_hote, const int num_port, const char * nom_proto){ + int sock; + struct sockaddr_in adresse; + struct hostent * hostent = NULL; + struct protoent * protoent = NULL; + + if (nom_hote != NULL) { + if ((hostent = gethostbyname(nom_hote)) == NULL) { + printf("Erreur : gethostbyname\n"); + return -1; + } + } + + if ((protoent = getprotobyname(nom_proto)) == NULL) { + printf("Erreur : getprotobyname\n"); + return -1; + } + + // Créer la socket nommée sock + if((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) { + printf("Erreur : socket"); + return -1; + } + + // Mise à 0 de la structure adresse + memset(& adresse, 0, sizeof(struct sockaddr_in)); + + // Donner la famille de socket dans la structure adresse + adresse.sin_family = AF_INET; + + adresse.sin_port = num_port; + + // Donner un numero de port à la structure adresse + if (num_port > 1024) { + adresse.sin_port = htons(num_port); + } + else { + adresse.sin_port = htons(0); + } + + // Donner l'adresse du serveur à la structure adresse + if (hostent != NULL) { + adresse.sin_addr.s_addr = ((struct in_addr *) (hostent->h_addr))->s_addr; + } + else { + adresse.sin_addr.s_addr = htonl(INADDR_ANY); + } + + // Pattacher un port a la socket sock + if (bind(sock, (struct sockaddr *) & adresse, sizeof(struct sockaddr_in)) < 0) { + close(sock); + printf("Erreur : bind\n"); + return -1; + } + + return sock; +} + +int affiche_adresse_socket (int sock) { + struct sockaddr_in adresse; + socklen_t longueur; + + longueur = sizeof(struct sockaddr_in); + + if (getsockname(sock, & adresse, & longueur) < 0) { + printf("Erreur : getsockname\n"); + return -1; + } + + printf ("IP = %s, Port = %u \n", inet_ntoa(adresse.sin_addr), ntohs(adresse.sin_port)); + return 0; +} + +int serveur_tcp (void) { + int sock_contact; // Socket créée du côté du serveur + int sock_connectee; // Socket du côté du client qui se connecte + struct sockaddr_in adresse; + socklen_t longueur; + + longueur = sizeof(struct sockaddr_in); + + // Appeler la fonction cree_socket_stream() pour créer la socket nommée socket_contact + // Choisir : nom de l'hote, le num du port, le protocole + + sock_contact = cree_socket_stream("0.0.0.0", 1234, "tcp"); + + if (sock_contact < 0) { + return -1; + } + + // Placer le serveur en écoute sur la socket nommée sock_contact + listen(sock_contact, 5); + + printf("Mon adresse >> "); + affiche_adresse_socket(sock_contact); + + while (1) { + // tester si un client se connecte : appel accept() bloquant + // Le retour de accept() est une nouvelle socket nommé sock_connectee + // avec laquelle l'échange avec le client aura lieu + + sock_connectee = accept(sock_contact, & adresse, & longueur); + + if (sock_connectee < 0) { + printf("Erreur : accept\n"); + return -1; + } + + printf("Nouveau client\n"); + + switch (fork()) { + case 0 : // Code du fils + close(sock_contact); + traite_connexion(sock_connectee); + exit(EXIT_SUCCESS); + case -1 : + printf("Erreur : fork\n"); + return -1; + default : // Code du pere + close(sock_connectee); + } + } + return 0; +} + +void traite_connexion (int sock){ + char buffer[256]; + int longueur; + + while (1) { + // Lire la socket et récupérer le nombre d'octets lus dans la variable longueur + longueur = read(sock, buffer, 256); + + if (longueur < 0) { + printf("Erreur : read\n"); + exit(EXIT_SUCCESS); + } + + if (longueur == 0) { + break; + } + + // printf("J'ai lu %d bytes\n",longueur); + // Pour le client telnet : + //buffer[longueur-2] = '\0'; + // Avec un client autre que telnet : + buffer[longueur]='\0'; + + // printf("Je melange %s\n",buffer); + //strfry(buffer); + + // Ecrire la variable buffer sur la socket + write(sock, buffer, longueur); + } + + close(sock); +} + + +int main (int argc, char * argv[]) { + return serveur_tcp(); +}