Ver Mensaje Individual
  #2 (permalink)  
Antiguo 10/12/2010, 16:03
tommylej
 
Fecha de Ingreso: noviembre-2010
Mensajes: 15
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: coger numeros archivo socket

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