Advertisement
Guest User

Untitled

a guest
Dec 12th, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.23 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <sys/socket.h>
  4. #include <netdb.h>
  5. #include <string.h>
  6. #include <stdlib.h>
  7. #include <stdbool.h>
  8.  
  9.  
  10. #define SERVADDR "localhost" // Définition de l'adresse IP d'écoute
  11. #define SERVPORT "0" // Définition du port d'écoute,
  12. // si 0 port choisi dynamiquement
  13. #define LISTENLEN 1 // Taille du tampon de demande de connexion
  14. #define MAXBUFFERLEN 1024
  15. #define MAXHOSTLEN 64
  16. #define MAXPORTLEN 6
  17.  
  18. void lancerSocketClient();
  19. void lancerSocketServeur();
  20.  
  21. int socketClient; // Descripteur de la socketClient
  22. int socketServeur; // Descripteur de socket de communication
  23. int ecodeClient; // Retour des fonctions coté client
  24. int ecodeServeur; // Code retour des fonctions coté serveur
  25.  
  26. int main(int argc, char* argv[]){
  27.  
  28. char bufferProxyClientServeur[MAXBUFFERLEN];
  29. // Buffer stockant les messages entre
  30. // le clientProxy et le serveur
  31.  
  32. char bufferProxyServeurClient[MAXBUFFERLEN];
  33. // Tampon de communication entre le client et le serveurProxy
  34.  
  35. char bufferProxy[MAXBUFFERLEN];
  36. // Tampon de communication entre cliet et serveur proxy
  37.  
  38. // Lancement des deux socket
  39. lancerSocketServeur();
  40. lancerSocketClient();
  41.  
  42.  
  43. // Login
  44. // Echange de données entre serveurProxy le client connecté
  45. strcpy(bufferProxyServeurClient, "220 Connexion au serveur\n");
  46. write(socketServeur, bufferProxyServeurClient, strlen(bufferProxyServeurClient));
  47.  
  48. // Echange de données entre serveurProxy et clientProxy
  49. read(socketServeur, bufferProxy, strlen(bufferProxy));
  50. write(socketClient,socketServeur,strlen(bufferProxy));
  51. //Echange de données entre le clientProxy et le serveur
  52. read(socketClient, bufferProxyClientServeur, MAXBUFFERLEN);
  53.  
  54. ecodeServeur = read(socketClient, bufferProxyClientServeur, MAXBUFFERLEN);
  55. if (ecodeServeur == -1) {perror("Problème de lecture\n"); exit(3);}
  56. bufferProxyClientServeur[ecodeServeur] = '\0';
  57. printf("MESSAGE RECU DU SERVEUR: \"%s\".\n",bufferProxyClientServeur);
  58.  
  59.  
  60.  
  61.  
  62. //Fermeture des sockets
  63. close(socketServeur);
  64. close(socketClient);
  65. }
  66.  
  67. void lancerSocketClient(){
  68.  
  69.  
  70. struct addrinfo *res,*resPtr; // Résultat de la fonction getaddrinfo
  71. struct addrinfo hints;
  72. char serverName[MAXHOSTLEN]; // Nom de la machine serveur
  73. char serverPort[MAXPORTLEN]; // Numéro de port
  74.  
  75. bool isConnected = false; // booléen indiquant que l'on est bien connecté
  76.  
  77. //On teste les valeurs rentrées par l'utilisateur
  78. /*
  79. if (argc != 3){ perror("Mauvaise utilisation de la commande: <nom serveur> <numero de port>\n"); exit(1);}
  80. if (strlen(argv[1]) >= MAXHOSTLEN){ perror("Le nom de la machine serveur est trop long\n"); exit(2);}
  81. if (strlen(argv[2]) >= MAXPORTLEN){ perror("Le numero de port du serveur est trop long\n"); exit(2);}
  82. */
  83. strncpy(serverName, "r-info-onyx", MAXHOSTLEN);
  84. serverName[MAXHOSTLEN-1] = '\0';
  85. strncpy(serverPort, "21", MAXPORTLEN);
  86. serverPort[MAXPORTLEN-1] = '\0';
  87.  
  88.  
  89.  
  90. // Initailisation de hints
  91. memset(&hints, 0, sizeof(hints));
  92. hints.ai_socktype = SOCK_STREAM; // TCP
  93. hints.ai_family = AF_UNSPEC; // les adresses IPv4 et IPv6 seront présentées par
  94. // la fonction getaddrinfo
  95.  
  96. //Récupération des informations sur le serveur
  97. ecodeClient = getaddrinfo(serverName,serverPort,&hints,&res);
  98. if (ecodeClient){
  99. fprintf(stderr,"getaddrinfo: %s\n", gai_strerror(ecodeClient));
  100. exit(1);
  101. }
  102.  
  103. resPtr = res;
  104.  
  105. while(!isConnected && resPtr!=NULL){
  106.  
  107. //Création de la socket IPv4/TCP
  108. socketClient = socket(resPtr->ai_family, resPtr->ai_socktype, resPtr->ai_protocol);
  109. if (socketClient == -1) {
  110. perror("Erreur creation socket");
  111. exit(2);
  112. }
  113.  
  114. //Connexion au serveur
  115. ecodeClient = connect(socketClient, resPtr->ai_addr, resPtr->ai_addrlen);
  116. if (ecodeClient == -1) {
  117. resPtr = resPtr->ai_next;
  118. close(socketClient);
  119. }
  120. // On a pu se connecté
  121. else isConnected = true;
  122. }
  123. freeaddrinfo(res);
  124. if (!isConnected){
  125. perror("Connexion impossible");
  126. exit(2);
  127. }
  128.  
  129. }
  130.  
  131. void lancerSocketServeur(){
  132.  
  133. char serverAddr[MAXHOSTLEN]; // Adresse du serveur
  134. char serverPort[MAXPORTLEN]; // Port du server
  135. int descSockRDV; // Descripteur de socket de rendez-vous
  136. struct addrinfo hints; // Contrôle la fonction getaddrinfo
  137. struct addrinfo *res; // Contient le résultat de la fonction getaddrinfo
  138. struct sockaddr_storage myinfo; // Informations sur la connexion de RDV
  139. struct sockaddr_storage from; // Informations sur le client connecté
  140. socklen_t len; // Variable utilisée pour stocker les
  141. // longueurs des structures de socket
  142.  
  143.  
  144. // Publication de la socket au niveau du système
  145. // Assignation d'une adresse IP et un numéro de port
  146. // Mise à zéro de hints
  147. memset(&hints, 0, sizeof(hints));
  148. // Initailisation de hints
  149. hints.ai_flags = AI_PASSIVE; // mode serveur, nous allons utiliser la fonction bind
  150. hints.ai_socktype = SOCK_STREAM; // TCP
  151. hints.ai_family = AF_UNSPEC; // les adresses IPv4 et IPv6 seront présentées par
  152. // la fonction getaddrinfo
  153.  
  154. // Récupération des informations du serveur
  155. ecodeServeur = getaddrinfo(SERVADDR, SERVPORT, &hints, &res);
  156. if (ecodeServeur) {
  157. fprintf(stderr,"getaddrinfo: %s\n", gai_strerror(ecodeServeur));
  158. exit(1);
  159. }
  160.  
  161. //Création de la socket IPv4/TCP
  162. descSockRDV = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
  163. if (descSockRDV == -1) {
  164. perror("Erreur creation socket");
  165. exit(4);
  166. }
  167.  
  168. // Publication de la socket
  169. ecodeServeur = bind(descSockRDV, res->ai_addr, res->ai_addrlen);
  170. if (ecodeServeur == -1) {
  171. perror("Erreur liaison de la socket de RDV");
  172. exit(3);
  173. }
  174. // Nous n'avons plus besoin de cette liste chainée addrinfo
  175. freeaddrinfo(res);
  176. // Récuppération du nom de la machine et du numéro de port pour affichage à l'écran
  177.  
  178. len=sizeof(struct sockaddr_storage);
  179. ecodeServeur=getsockname(descSockRDV, (struct sockaddr *) &myinfo, &len);
  180. if (ecodeServeur == -1)
  181. {
  182. perror("SERVEUR: getsockname");
  183. exit(4);
  184. }
  185. ecodeServeur = getnameinfo((struct sockaddr*)&myinfo, sizeof(myinfo), serverAddr,MAXHOSTLEN,
  186. serverPort, MAXPORTLEN, NI_NUMERICHOST | NI_NUMERICSERV);
  187. if (ecodeServeur != 0) {
  188. fprintf(stderr, "error in getnameinfo: %s\n", gai_strerror(ecodeServeur));
  189. exit(4);
  190. }
  191. printf("L'adresse d'ecoute est: %s\n", serverAddr);
  192. printf("Le port d'ecoute est: %s\n", serverPort);
  193. // Definition de la taille du tampon contenant les demandes de connexion
  194. ecodeServeur = listen(descSockRDV, LISTENLEN);
  195. if (ecodeServeur == -1) {
  196. perror("Erreur initialisation buffer d'écoute");
  197. exit(5);
  198. }
  199.  
  200. len = sizeof(struct sockaddr_storage);
  201. // Attente connexion du client
  202. // Lorsque demande de connexion, creation d'une socket de communication avec le client
  203. socketServeur = accept(descSockRDV, (struct sockaddr *) &from, &len);
  204. if (socketServeur == -1){
  205. perror("Erreur accept\n");
  206. exit(6);
  207. }
  208.  
  209. //Fermeture de la connexion
  210. close(descSockRDV);
  211. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement