Advertisement
Guest User

banana

a guest
Dec 11th, 2019
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.75 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.  
  8. #define PROXYADDR "localhost" // Définition de l'adresse IP d'écoute
  9. #define PROXYPORT "0" // Définition du port d'écoute,
  10. // si 0 port choisi dynamiquement
  11. #define LISTENLEN 1 // Taille du tampon de demande de connexion
  12. #define MAXBUFFERLEN 1024
  13. #define MAXHOSTLEN 64
  14. #define MAXPORTLEN 6
  15. #define SERVPORT "21"
  16. int main(){
  17. int ecode; // Code retour des fonctions
  18. char proxyAddr[MAXHOSTLEN]; // Adresse du serveur
  19. char proxyPort[MAXPORTLEN]; // Port du server
  20. int descSockRDV; // Descripteur de socket de rendez-vous
  21. int descSockCOM; // Descripteur de socket de communication
  22. struct addrinfo hints; // Contrôle la fonction getaddrinfo
  23. struct addrinfo *res; // Contient le résultat de la fonction getaddrinfo
  24. struct sockaddr_storage myinfo; // Informations sur la connexion de RDV
  25. struct sockaddr_storage from; // Informations sur le client connecté
  26. socklen_t len; // Variable utilisée pour stocker les
  27. // longueurs des structures de socket
  28. char buffer[MAXBUFFERLEN]; // Tampon de communication entre le client et le serveur
  29. char server_name [MAXHOSTLEN] ;
  30. char login [MAXBUFFERLEN] ;
  31.  
  32. // Publication de la socket au niveau du système
  33. // Assignation d'une adresse IP et un numéro de port
  34. // Mise à zéro de hints
  35. memset(&hints, 0, sizeof(hints));
  36. // Initailisation de hints
  37. hints.ai_flags = AI_PASSIVE; // mode serveur, nous allons utiliser la fonction bind
  38. hints.ai_socktype = SOCK_STREAM; // TCP
  39. hints.ai_family = AF_INET; // les adresses IPv4 et IPv6 seront présentées par
  40. // la fonction getaddrinfo
  41.  
  42. // Récupération des informations du serveur
  43. ecode = getaddrinfo(PROXYADDR, PROXYPORT, &hints, &res);
  44. if (ecode) {
  45. fprintf(stderr,"getaddrinfo: %s\n", gai_strerror(ecode));
  46. exit(1);
  47. }
  48.  
  49. //Création de la socket IPv4/TCP
  50. descSockRDV = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
  51. if (descSockRDV == -1) {
  52. perror("Erreur creation socket");
  53. exit(4);
  54. }
  55.  
  56. // Publication de la socket
  57. ecode = bind(descSockRDV, res->ai_addr, res->ai_addrlen);
  58. if (ecode == -1) {
  59. perror("Erreur liaison de la socket de RDV");
  60. exit(3);
  61. }
  62. // Nous n'avons plus besoin de cette liste chainée addrinfo
  63. freeaddrinfo(res);
  64. // Récuppération du nom de la machine et du numéro de port pour affichage à l'écran
  65.  
  66. len=sizeof(struct sockaddr_storage);
  67. ecode=getsockname(descSockRDV, (struct sockaddr *) &myinfo, &len);
  68. if (ecode == -1)
  69. {
  70. perror("SERVEUR: getsockname");
  71. exit(4);
  72. }
  73. ecode = getnameinfo((struct sockaddr*)&myinfo, sizeof(myinfo), proxyAddr,MAXHOSTLEN,
  74. proxyPort, MAXPORTLEN, NI_NUMERICHOST | NI_NUMERICSERV);
  75. if (ecode != 0) {
  76. fprintf(stderr, "error in getnameinfo: %s\n", gai_strerror(ecode));
  77. exit(4);
  78. }
  79. printf("L'adresse d'ecoute est: %s\n", proxyAddr);
  80. printf("Le port d'ecoute est: %s\n", proxyPort);
  81. // Definition de la taille du tampon contenant les demandes de connexion
  82. ecode = listen(descSockRDV, LISTENLEN);
  83. if (ecode == -1) {
  84. perror("Erreur initialisation buffer d'écoute");
  85. exit(5);
  86. }
  87.  
  88. len = sizeof(struct sockaddr_storage);
  89. // Attente connexion du client
  90. // Lorsque demande de connexion, creation d'une socket de communication avec le client
  91. descSockCOM = accept(descSockRDV, (struct sockaddr *) &from, &len);
  92. if (descSockCOM == -1){
  93. perror("Erreur accept\n");
  94. exit(6);
  95. }
  96. // Echange de données avec le client connecté
  97. strcpy(buffer, "220 PROXY FTP READY\n");
  98.  
  99. write(descSockCOM, buffer, strlen(buffer));
  100.  
  101. //Reception commande utilisateur type : USER login@serveur
  102. ecode = read(descSockCOM, buffer, MAXBUFFERLEN);
  103. if (ecode == -1) {perror("Problème de lecture\n"); exit(3);}
  104. buffer[ecode] = '\0';
  105. printf("MESSAGE RECU DU CLIENT: \"%s\".\n",buffer);
  106. sscanf(buffer,"%[^@]@%s",login,server_name);
  107. printf("NOM SERVEUR : \"%s\".\n",server_name);
  108.  
  109. // CONNEXION SERVEUR
  110.  
  111. // Initailisation de hints
  112. memset(&hints, 0, sizeof(hints));
  113. hints.ai_socktype = SOCK_STREAM; // TCP
  114. hints.ai_family = AF_UNSPEC; // les adresses IPv4 et IPv6 seront présentées par
  115. // la fonction getaddrinfo
  116.  
  117. //Récupération des informations sur le serveur
  118. ecode = getaddrinfo(server_name,SERVPORT,&hints,&res);
  119. if (ecode){
  120. fprintf(stderr,"getaddrinfo: %s\n", gai_strerror(ecode));
  121. exit(1);
  122. }
  123.  
  124. //Fermeture de la connexion
  125. close(descSockCOM);
  126. close(descSockRDV);
  127.  
  128.  
  129. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement