Autor Tema: numeros archivo socket  (Leído 4385 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado tomario

  • PIC10
  • *
  • Mensajes: 22
numeros archivo socket
« en: 10 de Diciembre de 2010, 19:11:32 »
hola he hecho el siguiente codigo de socket, en el que el cliente envia un archivo al servidor con unos numeros y este se los devuelve ordenados en otro archivo.
he hecho la comuncicacion y el cliente le envia el archivo por lineas.

lo que no se hacer es como coger los numeros de las lineas que va enviando y pasarlas a un vector.
ordenarlos si que se,

y luego como se los devuelvo??

archivo a ordenar:
Código: C
  1. 312;243;344;
  2. 625;166;577;88;4;
  3. 634;99;111;

servidor:
Código: C
  1. /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- S E R V I D O R -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <unistd.h>
  6. #include <errno.h>
  7. #include <string.h>
  8. #include <sys/types.h>
  9. #include <sys/socket.h>
  10. #include <netinet/in.h>
  11. #include <arpa/inet.h>
  12. #include <sys/wait.h>
  13. #include <signal.h>
  14. #include<ctype.h>
  15.  
  16. #define MYPORT 3490 // Puerto al que conectarán los usuarios
  17. #define MAXBUFLEN 200 // Maximo de caracteres para el buffer
  18. #define BACKLOG 10 // Conexiones pendientes en cola
  19.  
  20.  
  21. #define MAX 100
  22.  
  23. int longitud;//LONGITUD DE LA CADENA ENTRADA
  24. char salida[MAX];//SALIDA YA CONVERTIDA A LETRAS
  25. char actual[MAX];//VALOR DEL NUMERO ACTUAL
  26. char actualposterior[MAX];//VALOR DEL NUMERO POSTERIOR
  27. char revisada[MAX]; //LA ENTRADA UNA VEZ REVISADA PARA Q EL USUARIO NO ENTRE LETRAS
  28.  
  29. void num_letra(char revisada[]); //FUNCION Q "TRADUCE" AL CASTELLANO
  30.  
  31.  
  32. int sockfd; // El servidor escuchara por sockfd
  33. int newfd; // las transferencias de datos se realizar mediante newfd
  34. char buf[MAXBUFLEN];// buffer para recivir o enviar datos
  35. struct sockaddr_in my_addr; // contendra la direccion IP y el numero de puerto local
  36. struct sockaddr_in their_addr;//Contendra la direccion IP y numero de puerto del cliente
  37. socklen_t sin_size;//Contendra el tamaño de la escructura sockaddr_in
  38.  
  39. char *token = NULL;
  40. char vector [MAX];
  41. int cont,loop,a;
  42.  
  43. void crear_socket();
  44. void atributos();
  45. void socket_name();
  46. void escuchar();
  47. void aceptar();
  48. void recibir();
  49. void enviar(char cadena[]);
  50.  
  51. void crear_socket()//se crea el medio por el cual se va a realizar la comunicación:
  52. {
  53. //AF_INET = Dominio donde se realiza la conexión.( unidos mediante una red TCP/IP).
  54. //SOCK_STREAM = Uso del protocolo TCP
  55. //0 = selecciona el protocolo más apropiado
  56.  
  57. if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)//Crea el socket y verifica si hubo algun error
  58. {
  59. perror("socket");
  60. exit(1);
  61. }
  62. }
  63.  
  64. void atributos() // Asignamos valores a la estructura my_addr para luego poder llamar a la funcion bind()
  65. {
  66. my_addr.sin_family = AF_INET; //Se sa un servidor Stream (Protocolo TCP)
  67.  
  68. my_addr.sin_port = htons(MYPORT); //se asigna el puerto por el que se va a escuchar (3490)
  69.  
  70. my_addr.sin_addr.s_addr = INADDR_ANY; // se usa la IP local
  71.  
  72. bzero(&(my_addr.sin_zero), 8); // rellena con ceros el resto de la estructura
  73. }
  74.  
  75. void socket_name()//Le asignamos un nombre al socket, para recivir conexiones
  76. {
  77. if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
  78. {
  79. perror("bind");
  80. exit(1);
  81. }
  82. }
  83.  
  84. void escuchar()// Habilitamos el socket para recibir conexiones, con una cola de 10 conexiones en espera como maximo (BACKLOG)
  85. {
  86. if (listen(sockfd, BACKLOG) == -1)
  87. {
  88. perror("listen");
  89. exit(1);
  90. }
  91. }
  92.  
  93. void aceptar()//accept = Se utiliza en el servidor, con un socket habilitado para recibir conexiones
  94. {
  95. sin_size = sizeof(struct sockaddr_in);
  96.  
  97. //Se espera por conexiones
  98.  
  99. if ((newfd = accept(sockfd, (struct sockaddr *)&their_addr,&sin_size)) == -1)
  100. {
  101. perror("accept");
  102. exit(1); // Si se produce un error se finaliza el programa
  103. }
  104. printf("server: conexion desde: %s\n", inet_ntoa(their_addr.sin_addr));
  105. }
  106.  
  107. void recibir()
  108. {
  109. if ((recv(newfd, buf, MAXBUFLEN, 0)) == -1)// buf = tipo de funcion a realizar
  110. {
  111. perror("recv");
  112. exit(1);
  113. }
  114. }
  115.  
  116. void enviar(char cadena[])
  117. {
  118. if (send(newfd, cadena, MAXBUFLEN, 0) == -1)//envia el resultado de la conversion de numero a letras
  119. perror("send");
  120. exit(1);
  121. }
  122.  
  123. int main()//metodo principal
  124. {
  125. crear_socket();
  126.  
  127. atributos();
  128.  
  129. socket_name();
  130.  
  131. escuchar();
  132.  
  133. while(1) // ciclo para llamar accept
  134. {
  135. cont=0;
  136. // Llamamos a fork() para crear un proceso hijo que atendera a la conexion recien establecida
  137. aceptar();
  138. if (!fork())
  139. {
  140. //comienza el proceso hijo y enviamos los datos mediante newfd
  141.  
  142. recibir();//el servidor recive que tipo de funcion tiene que realizar
  143.  
  144. int a;
  145. if (strcmp (buf,"1") == 0)//1 = InitCap
  146. {
  147. cont=0;//cuenta las lineas que va recibiendo el servidor
  148. send(newfd, "", 1, 0);//+++++++++
  149. recibir();// se recibe la cantidad de lineas que tiene el archivo que abrió el cliente
  150. printf("lineas a procesar: %s\n",buf);
  151. loop = atoi(buf);//loop tiene la cantidad de lineas que tiene el archivo que abrió el cliente
  152. send(newfd, "", 1, 0);//+++++++++
  153. while(cont < loop)//el ciclo se repite el numero de lineas que tenga el archivo enviado por el cliente
  154. {
  155. cont++;//aumenta el contador de lineas
  156. recibir();//se reciben las lineas
  157.  
  158. /* AQUI NECESITO COGER LOS NUMEROS PASARLOS A UN VECTOR
  159. CUANDO HAYA PASADO TODAS LAS LINEAS Y TENGA TODOS LOS NUMEROS ORDENAR EL VECTOR*/
  160.  
  161. }
  162.  
  163. /*ESTO ORDENA EL VECTOR*/
  164. int temp;
  165. int j;
  166. for(i=0; i<(a-1); i++) {
  167. for (j=i+1; j<a; j++) {
  168. if(vector[j]<vector[i]) {
  169. temp=vector[j];
  170. vector[j]=vector[i];
  171. vector[i]=temp;
  172. }
  173. }
  174. }
  175. /* AQUI DEBO ENVIAR EL VECTOR AL CLIENTE SEPARANDO LOS NUMEROS POR ;*/
  176.  
  177. printf("Listo!!!\n\n");
  178.  
  179. close(newfd);
  180. exit(0);
  181. }
  182. close(newfd);
  183. }
  184. }

cliente:
Código: C
  1. /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- C L I E N T E -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <unistd.h>
  6. #include <errno.h>
  7. #include <string.h>
  8. #include <netdb.h>
  9. #include <sys/types.h>
  10. #include <netinet/in.h>
  11. #include <sys/socket.h>
  12. #include <iostream>
  13.  
  14. #define PORT 3490 // puerto al que vamos a conectar
  15.  
  16. #define MAXBUFLEN 100 // Maximo de caracteres para el buffer
  17. #define MAX 100
  18.  
  19. using namespace std;
  20.  
  21. char num[10],opcn[1];
  22. int sockfd, numbytes;
  23. char buf[MAXBUFLEN];
  24. struct hostent *he;
  25. struct sockaddr_in their_addr; // información de la dirección de destino
  26. size_t len;
  27.  
  28. FILE *archivo;
  29. FILE *archivo2;
  30. char name[MAX],name2[MAX];;
  31. char linea[MAX];
  32. int cont_line;
  33. char loop[100];
  34.  
  35. void crear_socket();
  36. void menu();
  37. void conectar();
  38. void atributos();
  39. void host_name(char *argv[]);
  40. void enviar_opcion();
  41. void enviar(char cadena[]);
  42. void recibir();
  43. void enviar_lineas();
  44.  
  45. void enviar_lineas()//enviar lineas del archivo, para que el servidor las procese
  46. {
  47. cont_line=-1;//contador de lineas del archivo
  48. while(!feof(archivo))//recorro el archivo, hasta llegar al final de este
  49. {
  50. fgets(linea,1000,archivo);//agarro cada linea del archivo
  51. cont_line++;//contador de lineas del archivo
  52. }
  53.  
  54. sprintf(loop,"%d",cont_line);//paso el valor entero de cont_line a loop, que es de tipo char[10]
  55. enviar(loop);//envío la cantidad de lineas al servidor, osea: tamaño que va a durar la conversación entre el servidor y el cliente
  56. recibir();//++++++++++
  57.  
  58. archivo=fopen(name,"r");//vuelvo a abrir el archivo pq el puntero quedó al final de este
  59.  
  60. archivo2=fopen(name2,"w+");//abro el archivo donde voy a guardar el resultado
  61.  
  62. while(!feof(archivo))//recorre todo el contenido del archivo
  63. {
  64. fgets(linea,1000,archivo);//agarra toda una linea del txt con un maximo de 1000 caracteres
  65. if(!feof(archivo))
  66. {
  67. enviar(linea);//envio las lineas al servidor
  68. recibir();//recibo las lineas ya modificadas por el servidor
  69. fprintf(archivo2,"%s",buf);//guardo en el archivo2 las lineas modificadas
  70. }
  71. }
  72. //se cierran los archivos
  73. fclose(archivo);
  74. fclose(archivo2);
  75. }
  76.  
  77. void menu()
  78. {
  79. int opc;
  80.  
  81. printf("***************\n");
  82. printf("* 1. Archivos *\n");
  83. printf("* 2. Salir *\n");
  84. printf("***************\n\n");
  85. scanf("%d",&opc);
  86. switch(opc)
  87. {
  88. case 1://archivos
  89.  
  90. printf ("\n Escriba el nombre del archivo que desea abrir: ");
  91. scanf("%s", &name);//se guarda en name el nombre del archivo de texto
  92. strcpy(name2,name);
  93. strcat(name2,"2");
  94. strcat(name,".txt");//se añade ".txt" en la última línea de name, para establecer la extensión
  95. strcat(name2,".txt");//se añade ".txt" en la última línea de name, para establecer la extensión
  96. archivo=fopen(name,"r");//se abre el archivo con el modo "r"(solo lectura y debe existir previamente)
  97. recibir();//+++++++++++
  98. enviar_lineas();
  99.  
  100. case 2://salir
  101. exit(1);
  102. break;
  103. }
  104. }
  105.  
  106. void host_name(char *argv[])//Se utiliza para convertir un nombre de un host a su dirección IP
  107. {
  108. if ((he=gethostbyname(argv[1])) == NULL)
  109. {
  110. perror("gethostbyname");
  111. exit(1);
  112. }
  113. }
  114.  
  115. void crear_socket()//se crea el socket para comunicarse con el servidor
  116. {
  117. if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  118. {
  119. perror("socket");
  120. exit(1);
  121. }
  122. }
  123.  
  124. void conectar()// nos conectamos con el servidor
  125. {
  126. if (connect(sockfd, (struct sockaddr *)&their_addr,sizeof(struct sockaddr)) == -1)
  127. {
  128. perror("connect");
  129. exit(1);
  130. }
  131. }
  132.  
  133. void atributos()//definimos el tipo de transferencia,puerto y la ip con la que nos vamos a comunicar
  134. {
  135. len = sizeof(struct sockaddr_in);
  136. their_addr.sin_family = AF_INET; // Ordenación de bytes de la máquina
  137. their_addr.sin_port = htons(PORT); // short, Ordenación de bytes de la red
  138. their_addr.sin_addr = *((struct in_addr *)he->h_addr);// se pasa la direccion ip al socket
  139. memset(&(their_addr.sin_zero), 8, len); // poner a cero el resto de la estructura
  140. }
  141.  
  142. void enviar(char cadena[])//envio de datos
  143. {
  144. if ((send(sockfd, cadena, strlen(cadena), 0)) == -1)
  145. {
  146. perror("send");
  147. exit(1);
  148. }
  149. }
  150.  
  151. void recibir()//resibir datos
  152. {
  153. if ((numbytes=recv(sockfd, buf, MAXBUFLEN, 0)) == -1)
  154. {
  155. perror("recv");
  156. exit(1);
  157. }
  158. }
  159.  
  160. int main(int argc, char *argv[])//metodo principal del programa
  161. {
  162. if (argc != 2)
  163. {
  164. fprintf(stderr,"usaste solo: %d argumento, escribe también el nombre del servidor\n",argc);
  165. exit(1);
  166. }
  167.  
  168. host_name(argv);
  169.  
  170. crear_socket();
  171.  
  172. atributos();
  173.  
  174. conectar();
  175.  
  176. menu();
  177.  
  178. close(sockfd);
  179. return 0;
  180. }

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: numeros archivo socket
« Respuesta #1 en: 10 de Diciembre de 2010, 19:24:48 »
Por favor sigue las normas del foro, no es necesario crear otro tema si ya lo vienes tratando, hubieras seguido el problema en el mismo hilo  :?

http://www.todopic.com.ar/foros/index.php?topic=33116.msg276788#msg276788


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado tomario

  • PIC10
  • *
  • Mensajes: 22
Re: numeros archivo socket
« Respuesta #2 en: 10 de Diciembre de 2010, 19:28:58 »
lo siento...:(
que hago dejo este?? o lo pongo en el otro??

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: numeros archivo socket
« Respuesta #3 en: 10 de Diciembre de 2010, 19:34:17 »
lo siento...:(
que hago dejo este?? o lo pongo en el otro??

Que se continué en éste ya que has posteado todo el código. Pero recuerda mantener el orden  ;-)

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado fidodido18

  • PIC18
  • ****
  • Mensajes: 312
Re: numeros archivo socket
« Respuesta #4 en: 05 de Enero de 2011, 12:43:48 »
hola he hecho el siguiente codigo de socket, en el que el cliente envia un archivo al servidor con unos numeros y este se los devuelve ordenados en otro archivo.
he hecho la comuncicacion y el cliente le envia el archivo por lineas.

lo que no se hacer es como coger los numeros de las lineas que va enviando y pasarlas a un vector.
ordenarlos si que se,

y luego como se los devuelvo??

archivo a ordenar:
Código: C
  1. uyy compañero, con todo respeto te recomiendo que progames en c# ya que c++ no esta diseñado para esto de los socket, claro esta que todo es posible en este lenguaje sin embargo es mucho mas difícil cuando la api crece.
  2. 312;243;344;
  3. 625;166;577;88;4;
  4. 634;99;111;

servidor:
Código: C
  1. /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- S E R V I D O R -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <unistd.h>
  6. #include <errno.h>
  7. #include <string.h>
  8. #include <sys/types.h>
  9. #include <sys/socket.h>
  10. #include <netinet/in.h>
  11. #include <arpa/inet.h>
  12. #include <sys/wait.h>
  13. #include <signal.h>
  14. #include<ctype.h>
  15.  
  16. #define MYPORT 3490 // Puerto al que conectarán los usuarios
  17. #define MAXBUFLEN 200 // Maximo de caracteres para el buffer
  18. #define BACKLOG 10 // Conexiones pendientes en cola
  19.  
  20.  
  21. #define MAX 100
  22.  
  23. int longitud;//LONGITUD DE LA CADENA ENTRADA
  24. char salida[MAX];//SALIDA YA CONVERTIDA A LETRAS
  25. char actual[MAX];//VALOR DEL NUMERO ACTUAL
  26. char actualposterior[MAX];//VALOR DEL NUMERO POSTERIOR
  27. char revisada[MAX]; //LA ENTRADA UNA VEZ REVISADA PARA Q EL USUARIO NO ENTRE LETRAS
  28.  
  29. void num_letra(char revisada[]); //FUNCION Q "TRADUCE" AL CASTELLANO
  30.  
  31.  
  32. int sockfd; // El servidor escuchara por sockfd
  33. int newfd; // las transferencias de datos se realizar mediante newfd
  34. char buf[MAXBUFLEN];// buffer para recivir o enviar datos
  35. struct sockaddr_in my_addr; // contendra la direccion IP y el numero de puerto local
  36. struct sockaddr_in their_addr;//Contendra la direccion IP y numero de puerto del cliente
  37. socklen_t sin_size;//Contendra el tamaño de la escructura sockaddr_in
  38.  
  39. char *token = NULL;
  40. char vector [MAX];
  41. int cont,loop,a;
  42.  
  43. void crear_socket();
  44. void atributos();
  45. void socket_name();
  46. void escuchar();
  47. void aceptar();
  48. void recibir();
  49. void enviar(char cadena[]);
  50.  
  51. void crear_socket()//se crea el medio por el cual se va a realizar la comunicación:
  52. {
  53. //AF_INET = Dominio donde se realiza la conexión.( unidos mediante una red TCP/IP).
  54. //SOCK_STREAM = Uso del protocolo TCP
  55. //0 = selecciona el protocolo más apropiado
  56.  
  57. if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)//Crea el socket y verifica si hubo algun error
  58. {
  59. perror("socket");
  60. exit(1);
  61. }
  62. }
  63.  
  64. void atributos() // Asignamos valores a la estructura my_addr para luego poder llamar a la funcion bind()
  65. {
  66. my_addr.sin_family = AF_INET; //Se sa un servidor Stream (Protocolo TCP)
  67.  
  68. my_addr.sin_port = htons(MYPORT); //se asigna el puerto por el que se va a escuchar (3490)
  69.  
  70. my_addr.sin_addr.s_addr = INADDR_ANY; // se usa la IP local
  71.  
  72. bzero(&(my_addr.sin_zero), 8); // rellena con ceros el resto de la estructura
  73. }
  74.  
  75. void socket_name()//Le asignamos un nombre al socket, para recivir conexiones
  76. {
  77. if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
  78. {
  79. perror("bind");
  80. exit(1);
  81. }
  82. }
  83.  
  84. void escuchar()// Habilitamos el socket para recibir conexiones, con una cola de 10 conexiones en espera como maximo (BACKLOG)
  85. {
  86. if (listen(sockfd, BACKLOG) == -1)
  87. {
  88. perror("listen");
  89. exit(1);
  90. }
  91. }
  92.  
  93. void aceptar()//accept = Se utiliza en el servidor, con un socket habilitado para recibir conexiones
  94. {
  95. sin_size = sizeof(struct sockaddr_in);
  96.  
  97. //Se espera por conexiones
  98.  
  99. if ((newfd = accept(sockfd, (struct sockaddr *)&their_addr,&sin_size)) == -1)
  100. {
  101. perror("accept");
  102. exit(1); // Si se produce un error se finaliza el programa
  103. }
  104. printf("server: conexion desde: %s\n", inet_ntoa(their_addr.sin_addr));
  105. }
  106.  
  107. void recibir()
  108. {
  109. if ((recv(newfd, buf, MAXBUFLEN, 0)) == -1)// buf = tipo de funcion a realizar
  110. {
  111. perror("recv");
  112. exit(1);
  113. }
  114. }
  115.  
  116. void enviar(char cadena[])
  117. {
  118. if (send(newfd, cadena, MAXBUFLEN, 0) == -1)//envia el resultado de la conversion de numero a letras
  119. perror("send");
  120. exit(1);
  121. }
  122.  
  123. int main()//metodo principal
  124. {
  125. crear_socket();
  126.  
  127. atributos();
  128.  
  129. socket_name();
  130.  
  131. escuchar();
  132.  
  133. while(1) // ciclo para llamar accept
  134. {
  135. cont=0;
  136. // Llamamos a fork() para crear un proceso hijo que atendera a la conexion recien establecida
  137. aceptar();
  138. if (!fork())
  139. {
  140. //comienza el proceso hijo y enviamos los datos mediante newfd
  141.  
  142. recibir();//el servidor recive que tipo de funcion tiene que realizar
  143.  
  144. int a;
  145. if (strcmp (buf,"1") == 0)//1 = InitCap
  146. {
  147. cont=0;//cuenta las lineas que va recibiendo el servidor
  148. send(newfd, "", 1, 0);//+++++++++
  149. recibir();// se recibe la cantidad de lineas que tiene el archivo que abrió el cliente
  150. printf("lineas a procesar: %s\n",buf);
  151. loop = atoi(buf);//loop tiene la cantidad de lineas que tiene el archivo que abrió el cliente
  152. send(newfd, "", 1, 0);//+++++++++
  153. while(cont < loop)//el ciclo se repite el numero de lineas que tenga el archivo enviado por el cliente
  154. {
  155. cont++;//aumenta el contador de lineas
  156. recibir();//se reciben las lineas
  157.  
  158. /* AQUI NECESITO COGER LOS NUMEROS PASARLOS A UN VECTOR
  159. CUANDO HAYA PASADO TODAS LAS LINEAS Y TENGA TODOS LOS NUMEROS ORDENAR EL VECTOR*/
  160.  
  161. }
  162.  
  163. /*ESTO ORDENA EL VECTOR*/
  164. int temp;
  165. int j;
  166. for(i=0; i<(a-1); i++) {
  167. for (j=i+1; j<a; j++) {
  168. if(vector[j]<vector[i]) {
  169. temp=vector[j];
  170. vector[j]=vector[i];
  171. vector[i]=temp;
  172. }
  173. }
  174. }
  175. /* AQUI DEBO ENVIAR EL VECTOR AL CLIENTE SEPARANDO LOS NUMEROS POR ;*/
  176.  
  177. printf("Listo!!!\n\n");
  178.  
  179. close(newfd);
  180. exit(0);
  181. }
  182. close(newfd);
  183. }
  184. }

cliente:
Código: C
  1. /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- C L I E N T E -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <unistd.h>
  6. #include <errno.h>
  7. #include <string.h>
  8. #include <netdb.h>
  9. #include <sys/types.h>
  10. #include <netinet/in.h>
  11. #include <sys/socket.h>
  12. #include <iostream>
  13.  
  14. #define PORT 3490 // puerto al que vamos a conectar
  15.  
  16. #define MAXBUFLEN 100 // Maximo de caracteres para el buffer
  17. #define MAX 100
  18.  
  19. using namespace std;
  20.  
  21. char num[10],opcn[1];
  22. int sockfd, numbytes;
  23. char buf[MAXBUFLEN];
  24. struct hostent *he;
  25. struct sockaddr_in their_addr; // información de la dirección de destino
  26. size_t len;
  27.  
  28. FILE *archivo;
  29. FILE *archivo2;
  30. char name[MAX],name2[MAX];;
  31. char linea[MAX];
  32. int cont_line;
  33. char loop[100];
  34.  
  35. void crear_socket();
  36. void menu();
  37. void conectar();
  38. void atributos();
  39. void host_name(char *argv[]);
  40. void enviar_opcion();
  41. void enviar(char cadena[]);
  42. void recibir();
  43. void enviar_lineas();
  44.  
  45. void enviar_lineas()//enviar lineas del archivo, para que el servidor las procese
  46. {
  47. cont_line=-1;//contador de lineas del archivo
  48. while(!feof(archivo))//recorro el archivo, hasta llegar al final de este
  49. {
  50. fgets(linea,1000,archivo);//agarro cada linea del archivo
  51. cont_line++;//contador de lineas del archivo
  52. }
  53.  
  54. sprintf(loop,"%d",cont_line);//paso el valor entero de cont_line a loop, que es de tipo char[10]
  55. enviar(loop);//envío la cantidad de lineas al servidor, osea: tamaño que va a durar la conversación entre el servidor y el cliente
  56. recibir();//++++++++++
  57.  
  58. archivo=fopen(name,"r");//vuelvo a abrir el archivo pq el puntero quedó al final de este
  59.  
  60. archivo2=fopen(name2,"w+");//abro el archivo donde voy a guardar el resultado
  61.  
  62. while(!feof(archivo))//recorre todo el contenido del archivo
  63. {
  64. fgets(linea,1000,archivo);//agarra toda una linea del txt con un maximo de 1000 caracteres
  65. if(!feof(archivo))
  66. {
  67. enviar(linea);//envio las lineas al servidor
  68. recibir();//recibo las lineas ya modificadas por el servidor
  69. fprintf(archivo2,"%s",buf);//guardo en el archivo2 las lineas modificadas
  70. }
  71. }
  72. //se cierran los archivos
  73. fclose(archivo);
  74. fclose(archivo2);
  75. }
  76.  
  77. void menu()
  78. {
  79. int opc;
  80.  
  81. printf("***************\n");
  82. printf("* 1. Archivos *\n");
  83. printf("* 2. Salir *\n");
  84. printf("***************\n\n");
  85. scanf("%d",&opc);
  86. switch(opc)
  87. {
  88. case 1://archivos
  89.  
  90. printf ("\n Escriba el nombre del archivo que desea abrir: ");
  91. scanf("%s", &name);//se guarda en name el nombre del archivo de texto
  92. strcpy(name2,name);
  93. strcat(name2,"2");
  94. strcat(name,".txt");//se añade ".txt" en la última línea de name, para establecer la extensión
  95. strcat(name2,".txt");//se añade ".txt" en la última línea de name, para establecer la extensión
  96. archivo=fopen(name,"r");//se abre el archivo con el modo "r"(solo lectura y debe existir previamente)
  97. recibir();//+++++++++++
  98. enviar_lineas();
  99.  
  100. case 2://salir
  101. exit(1);
  102. break;
  103. }
  104. }
  105.  
  106. void host_name(char *argv[])//Se utiliza para convertir un nombre de un host a su dirección IP
  107. {
  108. if ((he=gethostbyname(argv[1])) == NULL)
  109. {
  110. perror("gethostbyname");
  111. exit(1);
  112. }
  113. }
  114.  
  115. void crear_socket()//se crea el socket para comunicarse con el servidor
  116. {
  117. if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  118. {
  119. perror("socket");
  120. exit(1);
  121. }
  122. }
  123.  
  124. void conectar()// nos conectamos con el servidor
  125. {
  126. if (connect(sockfd, (struct sockaddr *)&their_addr,sizeof(struct sockaddr)) == -1)
  127. {
  128. perror("connect");
  129. exit(1);
  130. }
  131. }
  132.  
  133. void atributos()//definimos el tipo de transferencia,puerto y la ip con la que nos vamos a comunicar
  134. {
  135. len = sizeof(struct sockaddr_in);
  136. their_addr.sin_family = AF_INET; // Ordenación de bytes de la máquina
  137. their_addr.sin_port = htons(PORT); // short, Ordenación de bytes de la red
  138. their_addr.sin_addr = *((struct in_addr *)he->h_addr);// se pasa la direccion ip al socket
  139. memset(&(their_addr.sin_zero), 8, len); // poner a cero el resto de la estructura
  140. }
  141.  
  142. void enviar(char cadena[])//envio de datos
  143. {
  144. if ((send(sockfd, cadena, strlen(cadena), 0)) == -1)
  145. {
  146. perror("send");
  147. exit(1);
  148. }
  149. }
  150.  
  151. void recibir()//resibir datos
  152. {
  153. if ((numbytes=recv(sockfd, buf, MAXBUFLEN, 0)) == -1)
  154. {
  155. perror("recv");
  156. exit(1);
  157. }
  158. }
  159.  
  160. int main(int argc, char *argv[])//metodo principal del programa
  161. {
  162. if (argc != 2)
  163. {
  164. fprintf(stderr,"usaste solo: %d argumento, escribe también el nombre del servidor\n",argc);
  165. exit(1);
  166. }
  167.  
  168. host_name(argv);
  169.  
  170. crear_socket();
  171.  
  172. atributos();
  173.  
  174. conectar();
  175.  
  176. menu();
  177.  
  178. close(sockfd);
  179. return 0;
  180. }


 

anything