Changes between Version 2 and Version 3 of IOC_T06


Ignore:
Timestamp:
Apr 19, 2019, 12:26:37 PM (5 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • IOC_T06

    v2 v3  
    109109{{{
    110110#!c
     111#include <stdio.h>
     112#include <stdlib.h>
     113#include <unistd.h>
    111114#include <string.h>
    112 #include <unistd.h>
    113115#include <sys/types.h>
    114116#include <sys/socket.h>
    115117#include <netinet/in.h>
    116 
    117118#include <netdb.h>
    118 #include <arpa/inet.h>
    119 
    120119
    121120void error(const char *msg)
    122121{
    123122        perror(msg);
    124         exit(1);
     123        exit(0);
    125124}
    126125
    127126int main(int argc, char *argv[])
    128127{
    129         int sockfd, newsockfd, portno;
    130         socklen_t clilen;
     128        int sockfd, portno, n;
     129        struct sockaddr_in serv_addr;
     130        struct hostent *server;
     131
    131132        char buffer[256];
    132         struct sockaddr_in serv_addr, cli_addr;
    133         int n;
    134133
    135         if (argc < 2) {
    136                 fprintf(stderr, "ERROR, no port provided\n");
    137                 exit(1);
     134        // Le client doit connaitre l'adresse IP du serveur, et son numero de port
     135        if (argc < 3) {
     136                fprintf(stderr,"usage %s hostname port\n", argv[0]);
     137                exit(0);
    138138        }
     139        portno = atoi(argv[2]);
    139140
    140         // 1) on crée la socket, SOCK_STREAM signifie TCP
     141        // 1) Création de la socket, INTERNET et TCP
    141142
    142143        sockfd = socket(AF_INET, SOCK_STREAM, 0);
     
    144145                error("ERROR opening socket");
    145146
    146         // 2) on réclame au noyau l'utilisation du port passé en paramètre
    147         // INADDR_ANY dit que la socket va être affectée à toutes les interfaces locales
     147        server = gethostbyname(argv[1]);
     148        if (server == NULL) {
     149                fprintf(stderr,"ERROR, no such host\n");
     150                exit(0);
     151        }
     152
     153        // On donne toutes les infos sur le serveur
    148154
    149155        bzero((char *) &serv_addr, sizeof(serv_addr));
    150         portno = atoi(argv[1]);
    151156        serv_addr.sin_family = AF_INET;
    152         serv_addr.sin_addr.s_addr = INADDR_ANY;
     157        bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length);
    153158        serv_addr.sin_port = htons(portno);
    154         if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
    155                 error("ERROR on binding");
    156159
     160        // On se connecte. L'OS local nous trouve un numéro de port, grâce auquel le serveur
     161        // peut nous renvoyer des réponses, le \n permet de garantir que le message ne reste
     162        // pas en instance dans un buffer d'emission chez l'emetteur (ici c'est le clent).
    157163
    158         // On commence à écouter sur la socket. Le 5 est le nombre max
    159         // de connexions pendantes
     164        if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0)
     165                error("ERROR connecting");
    160166
    161         listen(sockfd, 5);
    162         while (1) {
    163                 newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
    164                 if (newsockfd < 0)
    165                     error("ERROR on accept");
     167        strcpy(buffer,"Coucou Peri\n");
     168        n = write(sockfd,buffer,strlen(buffer));
     169        if (n != strlen(buffer))
     170                error("ERROR message not fully trasmetted");
    166171
    167                 bzero(buffer, 256);
    168                 n = read(newsockfd, buffer, 255);
    169                 if (n < 0)
    170                     error("ERROR reading from socket");
    171 
    172                 printf("Received packet from %s:%d\nData: [%s]\n\n",
    173                        inet_ntoa(cli_addr.sin_addr), ntohs(cli_addr.sin_port),
    174                        buffer);
    175 
    176                 close(newsockfd);
    177         }
     172        // On ferme la socket
    178173
    179174        close(sockfd);
     
    182177}}}
    183178
     179** Makefile
     180
     181{{{
     182#!make
     183CFLAGS = -Wall -Werror
     184dep : server client usage
     185all : clean dep
     186clean :
     187        -rm server client
     188usage:
     189        @echo ""
     190        @echo "Usage :"
     191        @echo "    On the server computer, start the server:"
     192        @echo "       ./server port"
     193        @echo "    On the client computer, start the client:"
     194        @echo "       ./client ipserver portserver"
     195        @echo ""
     196}}}