Changes between Version 4 and Version 5 of IOC_T06


Ignore:
Timestamp:
Apr 19, 2019, 2:33:21 PM (5 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • IOC_T06

    v4 v5  
    5252Illustration dans un programme où le client envoie un message à un serveur (qui ne lui répond pas).
    5353
    54 ** client.c :
     54** server.c :
    5555{{{
    5656#!c
     57/* A simple server in the internet domain using TCP The port number is passed as an argument */
    5758#include <stdio.h>
    5859#include <stdlib.h>
     60#include <string.h>
    5961#include <unistd.h>
    60 #include <string.h>
    6162#include <sys/types.h>
    6263#include <sys/socket.h>
    6364#include <netinet/in.h>
     65
    6466#include <netdb.h>
     67#include <arpa/inet.h>
    6568
    6669void error(const char *msg)
    6770{
    6871        perror(msg);
    69         exit(0);
     72        exit(1);
    7073}
    7174
    7275int main(int argc, char *argv[])
    7376{
    74         int sockfd, portno, n;
    75         struct sockaddr_in serv_addr;
    76         struct hostent *server;
    77 
     77        int sockfd, newsockfd, portno;
     78        socklen_t clilen;
    7879        char buffer[256];
    79 
    80         // Le client doit connaitre l'adresse IP du serveur, et son numero de port
    81         if (argc < 3) {
    82                 fprintf(stderr,"usage %s hostname port\n", argv[0]);
    83                 exit(0);
    84         }
    85         portno = atoi(argv[2]);
    86        
    87         // 1) Création de la socket, INTERNET et TCP
     80        struct sockaddr_in serv_addr, cli_addr;
     81        int n;
     82
     83        if (argc < 2) {
     84                fprintf(stderr, "ERROR, no port provided\n");
     85                exit(1);
     86        }
     87
     88        // 1) on crée la socket, SOCK_STREAM signifie TCP
    8889
    8990        sockfd = socket(AF_INET, SOCK_STREAM, 0);
     
    9192                error("ERROR opening socket");
    9293
    93         server = gethostbyname(argv[1]);
    94         if (server == NULL) {
    95                 fprintf(stderr,"ERROR, no such host\n");
    96                 exit(0);
    97         }
    98 
    99         // On donne toutes les infos sur le serveur
     94        // 2) on réclame au noyau l'utilisation du port passé en paramètre
     95        // INADDR_ANY dit que la socket va être affectée à toutes les interfaces locales
    10096
    10197        bzero((char *) &serv_addr, sizeof(serv_addr));
     98        portno = atoi(argv[1]);
    10299        serv_addr.sin_family = AF_INET;
    103         bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length);
     100        serv_addr.sin_addr.s_addr = INADDR_ANY;
    104101        serv_addr.sin_port = htons(portno);
    105 
    106         // On se connecte. L'OS local nous trouve un numéro de port, grâce auquel le serveur
    107         // peut nous renvoyer des réponses, le \n permet de garantir que le message ne reste
    108         // pas en instance dans un buffer d'emission chez l'emetteur (ici c'est le clent).
    109 
    110         if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0)
    111                 error("ERROR connecting");
    112 
    113         strcpy(buffer,"Coucou Peri\n");
    114         n = write(sockfd,buffer,strlen(buffer));
    115 
    116         // On ferme la socket
     102        if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
     103                error("ERROR on binding");
     104
     105
     106        // On commence à écouter sur la socket. Le 5 est le nombre max
     107        // de connexions pendantes
     108
     109        listen(sockfd, 5);
     110        while (1) {
     111                newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
     112                if (newsockfd < 0)
     113                    error("ERROR on accept");
     114
     115                bzero(buffer, 256);
     116                n = read(newsockfd, buffer, 255);
     117                if (n < 0)
     118                    error("ERROR reading from socket");
     119
     120                printf("Received packet from %s:%d\nData: [%s]\n\n",
     121                       inet_ntoa(cli_addr.sin_addr), ntohs(cli_addr.sin_port),
     122                       buffer);
     123
     124                close(newsockfd);
     125        }
    117126
    118127        close(sockfd);
     
    121130}}}
    122131
    123 ** server.c
     132** client.c
    124133{{{
    125134#!c