Changes between Version 2 and Version 3 of IOC_T06
- Timestamp:
- Apr 19, 2019, 12:26:37 PM (6 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
IOC_T06
v2 v3 109 109 {{{ 110 110 #!c 111 #include <stdio.h> 112 #include <stdlib.h> 113 #include <unistd.h> 111 114 #include <string.h> 112 #include <unistd.h>113 115 #include <sys/types.h> 114 116 #include <sys/socket.h> 115 117 #include <netinet/in.h> 116 117 118 #include <netdb.h> 118 #include <arpa/inet.h>119 120 119 121 120 void error(const char *msg) 122 121 { 123 122 perror(msg); 124 exit( 1);123 exit(0); 125 124 } 126 125 127 126 int main(int argc, char *argv[]) 128 127 { 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 131 132 char buffer[256]; 132 struct sockaddr_in serv_addr, cli_addr;133 int n;134 133 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); 138 138 } 139 portno = atoi(argv[2]); 139 140 140 // 1) on crée la socket, SOCK_STREAM signifieTCP141 // 1) Création de la socket, INTERNET et TCP 141 142 142 143 sockfd = socket(AF_INET, SOCK_STREAM, 0); … … 144 145 error("ERROR opening socket"); 145 146 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 148 154 149 155 bzero((char *) &serv_addr, sizeof(serv_addr)); 150 portno = atoi(argv[1]);151 156 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); 153 158 serv_addr.sin_port = htons(portno); 154 if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)155 error("ERROR on binding");156 159 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). 157 163 158 // On commence à écouter sur la socket. Le 5 est le nombre max159 // de connexions pendantes164 if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) 165 error("ERROR connecting"); 160 166 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"); 166 171 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 178 173 179 174 close(sockfd); … … 182 177 }}} 183 178 179 ** Makefile 180 181 {{{ 182 #!make 183 CFLAGS = -Wall -Werror 184 dep : server client usage 185 all : clean dep 186 clean : 187 -rm server client 188 usage: 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 }}}