Advertisement
Guest User

Untitled

a guest
Jun 18th, 2017
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.57 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <unistd.h>
  4. #include <fcntl.h>
  5. #include <sys/types.h>
  6. #include <sys/stat.h>
  7. #include <string.h>
  8. #include <arpa/inet.h>
  9. #include <sys/socket.h>
  10. #include <errno.h>
  11.  
  12. #define PUERTO 6666
  13. #define MAX_USER 100
  14. #define MAX_PASS 300
  15.  
  16. ssize_t read_n(int fd, void*datos, int n);
  17. ssize_t write_n(int fd, void*datos, int n);
  18.  
  19. int main(int argc, char*argv[])
  20. {
  21. //Variables
  22. int sockfd, n_sd;
  23. int longitud;
  24. uint32_t longBE;
  25. char user[MAX_USER];
  26. char password[MAX_PASS];
  27. struct sockaddr_in server_addr, client_addr;
  28. socklen_t sin_size = sizeof(client_addr);
  29.  
  30. //Preparamos la direccion de memoria
  31. memset((char*)&server_addr, 0, sizeof(server_addr));
  32. server_addr.sin_family = AF_INET;
  33. server_addr.sin_port = htons(PUERTO);
  34. server_addr.sin_addr.s_addr = INADDR_ANY;
  35.  
  36. //Abrimos el socket
  37.  
  38. if((sockfd=socket(PF_INET, SOCK_STREAM, 0))<0){
  39. perror("socket");
  40. exit(1);
  41. }
  42.  
  43. //Vinculamos el puerto con el socket
  44.  
  45. if(bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr))<0){
  46. perror("Bind");
  47. exit(1);
  48. }
  49.  
  50. //Ponemos el servidor en modo escucha
  51.  
  52. if(listen(sockfd,10)<0){
  53. perror("listen");
  54. exit(1);
  55. }
  56.  
  57. while(1){
  58. printf("Esperando conexion...\n");
  59. //Hemos aceptado una peticion
  60. n_sd=accept(sockfd, (struct sockaddr*)&client_addr, &sin_size);
  61.  
  62. //Abrimos claves.txt
  63. FILE * file = fopen("claves.txt", "r");
  64.  
  65. //Recibimos longitud y cadena de usuario
  66. if(read_n(n_sd, &longBE, sizeof(longBE))!=sizeof(longBE)){
  67. perror("read longBE");
  68. close(n_sd);
  69. fclose(file);
  70. exit(1);
  71. }
  72.  
  73. longitud = ntohl(longBE);
  74.  
  75. if(read_n(n_sd, user, longitud)!=longitud){
  76. perror("read user");
  77. fclose(file);
  78. close(n_sd);
  79. exit(1);
  80. }
  81.  
  82. user[longitud]= '\0';
  83. printf("User: %s\n", user);
  84.  
  85.  
  86. //Buscamos usuario y enviamos retorno
  87. char linea[500];
  88. int encontrado = -1;
  89. while(fgets(linea, 500-1, file)!=NULL){
  90. linea[strlen(linea)-1] = '\0';
  91. char*puntero = strstr(linea, "@");
  92. *puntero = '\0';
  93. char*usuario = linea;
  94.  
  95. if(strcmp(user, usuario)==0){
  96. encontrado = 0;
  97. //Si esta usuario, recibimos longitud y pass
  98. longBE = htonl(encontrado);
  99. if(write_n(n_sd, &longBE, sizeof(longBE))!=sizeof(longBE)){
  100. perror("write no encontrado el user");
  101. fclose(file);
  102. close(n_sd);
  103. exit(1);
  104. }
  105.  
  106. if(read_n(n_sd, &longBE, sizeof(longBE))!=sizeof(longBE)){
  107. perror("read long pass");
  108. fclose(file);
  109. close(n_sd);
  110. exit(1);
  111. }
  112.  
  113. longitud=ntohl(longBE);
  114.  
  115. if(read_n(n_sd, password, longitud)!=longitud){
  116. perror("read pass");
  117. fclose(file);
  118. close(n_sd);
  119. exit(1);
  120. }
  121.  
  122. password[longitud]='\0';
  123.  
  124. printf("Password: %s\n", password);
  125.  
  126. //Buscamos la pass en la linea de coincidencia
  127.  
  128. char*contrasena = puntero+1;
  129.  
  130. int pass = -1;
  131.  
  132. printf("Password: %s\n", contrasena);
  133.  
  134. //Enviamos retorno
  135.  
  136. if(strcmp(password,contrasena)==0){
  137. pass = 0;
  138.  
  139. }
  140. longBE = htonl(pass);
  141. if(write_n(n_sd, &longBE, sizeof(longBE))!=sizeof(longBE)){
  142. perror("write ret pass");
  143. fclose(file);
  144. close(n_sd);
  145. exit(1);
  146. }
  147.  
  148. break;
  149. }
  150. }//while(fgets);
  151.  
  152. if(encontrado==-1){
  153. longBE = htonl(encontrado);
  154. if(write_n(n_sd, &longBE, sizeof(longBE))!=sizeof(longBE)){
  155. perror("write no encontrado el user");
  156. fclose(file);
  157. close(n_sd);
  158. exit(1);
  159. }
  160. }
  161.  
  162. if(close(n_sd)<0){
  163. perror("close n_sd");
  164. fclose(file);
  165. exit(1);
  166. }
  167.  
  168. if(fclose(file)<0){
  169. perror("close file");
  170. exit(1);
  171. }
  172.  
  173.  
  174.  
  175.  
  176. }//while(1)
  177.  
  178. if(close(sockfd)<0){
  179. perror("close sd");
  180. exit(1);
  181. }
  182.  
  183. }
  184.  
  185. ssize_t read_n(int fd, void*datos, int n)
  186. {
  187. ssize_t totalLeidos = 0;
  188. ssize_t intentandoLeer = n;
  189. ssize_t leidos;
  190. do{
  191. errno = 0;
  192. leidos=read(fd, totalLeidos + datos, intentandoLeer);
  193. if(leidos>0){
  194. totalLeidos += leidos;
  195. intentandoLeer -= leidos;
  196. }
  197. }while(((totalLeidos <n)&&(leidos>0))||(errno==EINTR));
  198.  
  199. if(leidos<0){
  200. return leidos;
  201. }else{
  202. return totalLeidos;
  203. }
  204. }
  205.  
  206. ssize_t write_n(int fd, void*datos, int n)
  207. {
  208. ssize_t totalLeidos = 0;
  209. ssize_t intentandoLeer = n;
  210. ssize_t leidos;
  211. do{
  212. errno = 0;
  213. leidos=write(fd, totalLeidos + datos, intentandoLeer);
  214. if(leidos>0){
  215. totalLeidos += leidos;
  216. intentandoLeer -= leidos;
  217. }
  218. }while(((totalLeidos <n)&&(leidos>0))||(errno==EINTR));
  219.  
  220. if(leidos<0){
  221. return leidos;
  222. }else{
  223. return totalLeidos;
  224. }
  225. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement