Reglamento general de los foros   •   FAQ   •   Buscar en el foro •  Registrarse | Iniciar sesión 



Foros Linux » Desarrollo » Programación


Nuevo tema Responder al tema
 [ 2 mensajes ] 
Patrocinadores

Autor
Buscar:
Mensaje

Desconectado
Forista Nuevo
Forista Nuevo

Registrado: Mié Nov 10, 2010 3:44 pm
Mensajes: 13

Nota Publicado: Vie Dic 10, 2010 4:04 pm 
Arriba  
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:
312;243;344;
625;166;577;88;4;
634;99;111;


servidor:
Código:
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- S E R V I D O R -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/wait.h>
#include <signal.h>
#include<ctype.h>

#define MYPORT 3490    // Puerto al que conectarán los usuarios
#define MAXBUFLEN 200  // Maximo de caracteres para el buffer
#define BACKLOG 10     // Conexiones pendientes en cola


#define MAX 100

int longitud;//LONGITUD DE LA CADENA ENTRADA
char salida[MAX];//SALIDA YA CONVERTIDA A LETRAS
char actual[MAX];//VALOR DEL NUMERO ACTUAL
char actualposterior[MAX];//VALOR DEL NUMERO POSTERIOR
char revisada[MAX]; //LA ENTRADA UNA VEZ REVISADA PARA Q EL USUARIO NO ENTRE LETRAS

void num_letra(char revisada[]); //FUNCION Q "TRADUCE" AL CASTELLANO


int sockfd; // El servidor escuchara por sockfd
int newfd; // las transferencias de datos se realizar mediante newfd
char buf[MAXBUFLEN];// buffer para recivir o enviar datos
struct sockaddr_in my_addr; // contendra la direccion IP y el numero de puerto local
struct sockaddr_in their_addr;//Contendra la direccion IP y numero de puerto del cliente
socklen_t sin_size;//Contendra el tamaño de la escructura sockaddr_in

char *token = NULL;
char vector [MAX];
int cont,loop,a;

void crear_socket();
void atributos();
void socket_name();
void escuchar();
void aceptar();
void recibir();
void enviar(char cadena[]);

void crear_socket()//se crea el medio por el cual se va a realizar la comunicación:
{
  //AF_INET = Dominio donde se realiza la conexión.( unidos mediante una red TCP/IP).
  //SOCK_STREAM = Uso del protocolo TCP
  //0 = selecciona el protocolo más apropiado

  if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)//Crea el socket y verifica si hubo algun error
  {
    perror("socket");
    exit(1);
  }
}

void atributos() // Asignamos valores a la estructura my_addr para luego poder llamar a la funcion bind()
{
  my_addr.sin_family = AF_INET; //Se sa un servidor Stream (Protocolo TCP)

  my_addr.sin_port = htons(MYPORT); //se asigna el puerto por el que se va a escuchar (3490)

  my_addr.sin_addr.s_addr = INADDR_ANY; // se usa la IP local

  bzero(&(my_addr.sin_zero), 8); // rellena con ceros el resto de la estructura
}

void socket_name()//Le asignamos un nombre al socket, para recivir conexiones
{
  if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
  {
    perror("bind");
    exit(1);
  }
}

void escuchar()// Habilitamos el socket para recibir conexiones, con una cola de 10 conexiones en espera como maximo (BACKLOG)
{
  if (listen(sockfd, BACKLOG) == -1)
  {
    perror("listen");
    exit(1);
  } 
}

void aceptar()//accept = Se utiliza en el servidor, con un socket habilitado para recibir conexiones
{
  sin_size = sizeof(struct sockaddr_in);
   
  //Se espera por conexiones
   
  if ((newfd = accept(sockfd, (struct sockaddr *)&their_addr,&sin_size)) == -1)
  {
    perror("accept");
    exit(1); // Si se produce un error se finaliza el programa
  }
  printf("server: conexion desde: %s\n", inet_ntoa(their_addr.sin_addr)); 
}

void recibir()
{
  if ((recv(newfd, buf, MAXBUFLEN, 0)) == -1)// buf = tipo de funcion a realizar
  {
    perror("recv");
    exit(1);
  }
}

void enviar(char cadena[])
{
  if (send(newfd, cadena, MAXBUFLEN, 0) == -1)//envia el resultado de la conversion de numero a letras
  perror("send");
  exit(1);
}

int main()//metodo principal
{
  crear_socket();
 
  atributos();
 
  socket_name();

  escuchar();

  while(1) // ciclo para llamar accept
  {
    cont=0;
    // Llamamos a fork() para crear un proceso hijo que atendera a la conexion recien establecida
    aceptar();
    if (!fork())
    {
      //comienza el proceso hijo y enviamos los datos mediante newfd
     
      recibir();//el servidor recive que tipo de funcion tiene que realizar
     
      int a;
      if (strcmp (buf,"1") == 0)//1 = InitCap
      {
   cont=0;//cuenta las lineas que va recibiendo el servidor
   send(newfd, "", 1, 0);//+++++++++
   recibir();// se recibe la cantidad de lineas que tiene el archivo que abrió el cliente
   printf("lineas a procesar: %s\n",buf);
   loop = atoi(buf);//loop tiene la cantidad de lineas que tiene el archivo que abrió el cliente
   send(newfd, "", 1, 0);//+++++++++
   while(cont < loop)//el ciclo se repite el numero de lineas que tenga el archivo enviado por el cliente
   {
     cont++;//aumenta el contador de lineas
     recibir();//se reciben las lineas
    
     [b]/* AQUI NECESITO COGER LOS NUMEROS PASARLOS A UN VECTOR
     CUANDO HAYA PASADO TODAS LAS LINEAS Y TENGA TODOS LOS NUMEROS ORDENAR EL VECTOR*/[/b]
    
      }
    
     /*ESTO ORDENA EL VECTOR*/
   int temp;
   int j;
   for(i=0; i<(a-1); i++) {
     for (j=i+1; j<a; j++) {
        if(vector[j]<vector[i]) {
            temp=vector[j];
            vector[j]=vector[i];
            vector[i]=temp;
        }
     }
   }
      [b]/* AQUI DEBO ENVIAR EL VECTOR AL CLIENTE SEPARANDO LOS NUMEROS POR ;*/[/b]
   
   printf("Listo!!!\n\n");
     
      close(newfd);
      exit(0);
    }
    close(newfd);
  }
}


cliente:
Código:
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- C L I E N T E -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <iostream>

#define PORT 3490 // puerto al que vamos a conectar

#define MAXBUFLEN 100  // Maximo de caracteres para el buffer
#define MAX 100

using namespace std;
   
char num[10],opcn[1];
int sockfd, numbytes; 
char buf[MAXBUFLEN];
struct hostent *he;
struct sockaddr_in their_addr; // información de la dirección de destino
size_t len;

FILE *archivo;
FILE *archivo2;
char name[MAX],name2[MAX];;
char linea[MAX];
int cont_line;
char loop[100];

void crear_socket();
void menu();
void conectar();
void atributos();
void host_name(char *argv[]);
void enviar_opcion();
void enviar(char cadena[]);
void recibir();
void enviar_lineas();

void enviar_lineas()//enviar lineas del archivo, para que el servidor las procese
{
  cont_line=-1;//contador de lineas del archivo
  while(!feof(archivo))//recorro el archivo, hasta llegar al final de este
  {
    fgets(linea,1000,archivo);//agarro cada linea del archivo
    cont_line++;//contador de lineas del archivo
  }
 
  sprintf(loop,"%d",cont_line);//paso el valor entero de cont_line a loop, que es de tipo char[10]
  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
  recibir();//++++++++++
 
  archivo=fopen(name,"r");//vuelvo a abrir el archivo porque el puntero quedó al final de este

  archivo2=fopen(name2,"w+");//abro el archivo donde voy a guardar el resultado
 
  while(!feof(archivo))//recorre todo el contenido del archivo
  {
    fgets(linea,1000,archivo);//agarra toda una linea del txt con un maximo de 1000 caracteres
    if(!feof(archivo))
    {
      enviar(linea);//envio las lineas al servidor
      recibir();//recibo las lineas ya modificadas por el servidor
      fprintf(archivo2,"%s",buf);//guardo en el archivo2 las lineas modificadas
    }
  }
  //se cierran los archivos
  fclose(archivo);
  fclose(archivo2);
}
 
void menu()
{
  int opc;
 
  printf("***************\n");
  printf("* 1. Archivos *\n");
  printf("* 2. Salir    *\n");
  printf("***************\n\n");
  scanf("%d",&opc);
  switch(opc)
  {
    case 1://archivos
     
    printf ("\n Escriba el nombre del archivo que desea abrir: ");
   scanf("%s", &name);//se guarda en name el nombre del archivo de texto
    strcpy(name2,name);
    strcat(name2,"2");
    strcat(name,".txt");//se añade ".txt" en la última línea de name, para establecer la extensión
    strcat(name2,".txt");//se añade ".txt" en la última línea de name, para establecer la extensión
    archivo=fopen(name,"r");//se abre el archivo con el modo "r"(solo lectura y debe existir previamente)
    recibir();//+++++++++++
   enviar_lineas();
       
    case 2://salir
      exit(1);
    break;
  }
}

void host_name(char *argv[])//Se utiliza para convertir un nombre de un host a su dirección IP
{
  if ((he=gethostbyname(argv[1])) == NULL)
  { 
    perror("gethostbyname");
    exit(1);
  }
}

void crear_socket()//se crea el socket para comunicarse con el servidor
{
  if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  {
    perror("socket");
    exit(1);
  }   
}

void conectar()// nos conectamos con el servidor
{
  if (connect(sockfd, (struct sockaddr *)&their_addr,sizeof(struct sockaddr)) == -1)
  {
    perror("connect");
    exit(1);
  }
}

void atributos()//definimos el tipo de transferencia,puerto y la ip con la que nos vamos a comunicar
{
  len = sizeof(struct sockaddr_in);
  their_addr.sin_family = AF_INET;    // Ordenación de bytes de la máquina
  their_addr.sin_port = htons(PORT);  // short, Ordenación de bytes de la red
  their_addr.sin_addr = *((struct in_addr *)he->h_addr);// se pasa la direccion ip al socket
  memset(&(their_addr.sin_zero), 8, len);  // poner a cero el resto de la estructura
}

void enviar(char cadena[])//envio de datos
{
  if ((send(sockfd, cadena, strlen(cadena), 0)) == -1)
  {
    perror("send");
    exit(1);
  }    
}

void recibir()//resibir datos
{
  if ((numbytes=recv(sockfd, buf, MAXBUFLEN, 0)) == -1)
  {
    perror("recv");
    exit(1);
  }
}

int main(int argc, char *argv[])//metodo principal del programa
{
  if (argc != 2)
  {
    fprintf(stderr,"usaste solo: %d argumento, escribe también el nombre del servidor\n",argc);
    exit(1);
  }
   
  host_name(argv);
   
  crear_socket();
 
  atributos();
 
  conectar();
 
  menu();

  close(sockfd);
  return 0;
}

 Perfil Email  

Desconectado
Moderador
Moderador
Avatar de Usuario

Registrado: Mié Nov 28, 2007 12:00 am
Mensajes: 1361
Ubicación: En la X del explorer (pulse para llamar)

Nota Publicado: Vie Dic 10, 2010 5:04 pm 
Arriba  
Para tu primera duda, lo que necesitas es una función que haga un split (creo que c++ la tiene). Si usas C, puedes probar con strtok (que necesitarás revisar el manual) o utilizar el código que han dejado en el siguiente enlace:
http://luauf.com/2008/05/17/funcion-split-en-c/
Sería cuestión de leer una línea, y hacer el correspondiente split.

Para la segunda duda, suponiendo que tengas la lista ordenada, lo más sencillo (creo) es que escribas esa lista en una cadena, de forma similar a la que te está llegando al servidor.
Si te llega "34;12;23;", creas una nueva cadena poniendo "12;23;34;" y la envías de vuelta:
Código:
char *cadena;
cadena = "12;23;34";   //no lo vas a asignar así, pero para hacerte una idea es suficiente
send(newfd,cadena,strlen(cadena),0);

_________________
Descargue el gestor de mp3 "Music Manager" -> (mmlf)
Última versión del gestor "Music Manager" -> (jmmm)

 Perfil  
Mostrar mensajes previos:  Ordenar por  
 [ 2 mensajes ] 
Nuevo tema Responder al tema

Saltar a:  


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 4 invitados

No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro
No puede enviar adjuntos en este Foro

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group :: Style based on FI Subice by phpBBservice.nl :: Todos los horarios son UTC - 6 horas
Traducción al español por Huan Manwë
phpBB SEO