Ver Mensaje Individual
  #1 (permalink)  
Antiguo 10/12/2010, 16:03
tommylej
 
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. }