Foros del Web » Programación para mayores de 30 ;) » C/C++ »

coger numeros archivo socket

Estas en el tema de coger numeros archivo socket en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 10/12/2010, 16:03
 
Fecha de Ingreso: noviembre-2010
Mensajes: 15
Antigüedad: 13 años, 5 meses
Puntos: 0
coger numeros archivo socket

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:
Ver original
  1. 312;243;344;
  2. 625;166;577;88;4;
  3. 634;99;111;

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

Hay cosas que no me cierran del codigo. Porque el cliente envia una parte y espera a recivir. No deberia mandar el archivo entero y despues recibir??

Por otro lado, yo no mandaria el archivo asi entero. Sino que leeria de a entero y lo vas mandando como un entero y no como una cadena de caracteres.

Para leer del archivo podrias usar
fscanf(archivo,"%d;",entero);

Por cada entero que lees lo vas almacenando en un array y luego mandas el array:

send(sockfd, vector,sizeof(int) * cant_elemento , 0);
  #4 (permalink)  
Antiguo 10/12/2010, 16:43
 
Fecha de Ingreso: noviembre-2010
Mensajes: 15
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: coger numeros archivo socket

el codigo tendra muchos errores porque es la primera vez que trabajo con sockets, entonces cualquier cosa que me digais para mejorarlo o que veais que esta mal me gustaria que me lo dijeran, para cambiarlo y probarlo,
muchas gracias

Etiquetas: numeros, socket
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:19.