Programación General > C/C++

 numeros archivo socket

(1/1)

tomario:
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 --- 312;243;344;625;166;577;88;4;634;99;111;  
servidor:

--- Código: C --- /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- 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 ENTRADAchar salida[MAX];//SALIDA YA CONVERTIDA A LETRASchar actual[MAX];//VALOR DEL NUMERO ACTUALchar actualposterior[MAX];//VALOR DEL NUMERO POSTERIORchar 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 sockfdint newfd; // las transferencias de datos se realizar mediante newfdchar buf[MAXBUFLEN];// buffer para recivir o enviar datosstruct sockaddr_in my_addr; // contendra la direccion IP y el numero de puerto localstruct sockaddr_in their_addr;//Contendra la direccion IP y numero de puerto del clientesocklen_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: %sn", 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 letrasperror("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 establecidaaceptar();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 servidorsend(newfd, "", 1, 0);//+++++++++recibir();// se recibe la cantidad de lineas que tiene el archivo que abrió el clienteprintf("lineas a procesar: %sn",buf);loop = atoi(buf);//loop tiene la cantidad de lineas que tiene el archivo que abrió el clientesend(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 lineasrecibir();//se reciben las lineas /* AQUI NECESITO COGER LOS NUMEROS PASARLOS A UN VECTORCUANDO HAYA PASADO TODAS LAS LINEAS Y TENGA TODOS LOS NUMEROS ORDENAR EL VECTOR*/ } /*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;}}}/* AQUI DEBO ENVIAR EL VECTOR AL CLIENTE SEPARANDO LOS NUMEROS POR ;*/ printf("Listo!!!nn"); close(newfd);exit(0);}close(newfd);}}  
cliente:

--- Código: C --- /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- 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 destinosize_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 archivowhile(!feof(archivo))//recorro el archivo, hasta llegar al final de este{fgets(linea,1000,archivo);//agarro cada linea del archivocont_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 clienterecibir();//++++++++++ archivo=fopen(name,"r");//vuelvo a abrir el archivo pq 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 caracteresif(!feof(archivo)){enviar(linea);//envio las lineas al servidorrecibir();//recibo las lineas ya modificadas por el servidorfprintf(archivo2,"%s",buf);//guardo en el archivo2 las lineas modificadas}}//se cierran los archivosfclose(archivo);fclose(archivo2);} void menu(){int opc; printf("***************n");printf("* 1. Archivos *n");printf("* 2. Salir *n");printf("***************nn");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 textostrcpy(name2,name);strcat(name2,"2");strcat(name,".txt");//se añade ".txt" en la última línea de name, para establecer la extensiónstrcat(name2,".txt");//se añade ".txt" en la última línea de name, para establecer la extensiónarchivo=fopen(name,"r");//se abre el archivo con el modo "r"(solo lectura y debe existir previamente)recibir();//+++++++++++enviar_lineas(); case 2://salirexit(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áquinatheir_addr.sin_port = htons(PORT); // short, Ordenación de bytes de la redtheir_addr.sin_addr = *((struct in_addr *)he->h_addr);// se pasa la direccion ip al socketmemset(&(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 servidorn",argc);exit(1);} host_name(argv); crear_socket(); atributos(); conectar(); menu(); close(sockfd);return 0;}  

Navegación

[0] Índice de Mensajes

Ir a la versión completa