Advertisement
Guest User

proxy5

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