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

Envio de archivo binario a traves de socket

Estas en el tema de Envio de archivo binario a traves de socket en el foro de C/C++ en Foros del Web. Hola gente estoy haciendo 2 archivos para que se envien un archivo binario. Estoy probando con una foto de 32 k practicamente. Me la envia ...
  #1 (permalink)  
Antiguo 19/06/2011, 16:35
 
Fecha de Ingreso: mayo-2006
Mensajes: 79
Antigüedad: 17 años, 10 meses
Puntos: 0
Envio de archivo binario a traves de socket

Hola gente estoy haciendo 2 archivos para que se envien un archivo binario. Estoy probando con una foto de 32 k practicamente. Me la envia pero no la puedo abrir. Asique hay algo que esta mal.
Tengo un servidor que recibe la imagen y un cliente q la envial
les muestro los codigos

Cliente.c
Código C:
Ver original
  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <stdio.h>
  4. #include <sys/select.h>
  5. #include <sys/types.h>
  6. #include <sys/socket.h>
  7. #include <arpa/inet.h>
  8. #include <unistd.h>
  9.  
  10. int main(int argc, char **argv) {
  11.  
  12.  
  13. FILE *f1;
  14. char buffer2[1024000];
  15. int leidos;
  16. char buf2[30];
  17.  
  18.         /* Creo el Socket: SOCK_STREAM para TCP y SOCK_DGRAM par UDP */
  19.         int descriptor = socket(AF_INET, SOCK_STREAM, 0);
  20.  
  21.         /* Direccion Local */
  22.         struct sockaddr_in *local_address = malloc(sizeof(struct sockaddr_in));
  23.         /* Direccion remota ( a la que me quiero conectar )*/
  24.         struct sockaddr_in *remote_address = malloc(sizeof(struct sockaddr_in));
  25.  
  26.         {       /* Con esto fuerzo a que el puerto local sea el 5201 y que tome la IP por defecto de la PC */
  27.                 local_address->sin_family = AF_INET;
  28.                 local_address->sin_addr.s_addr = INADDR_ANY;
  29.                 local_address->sin_port = htons(5301);
  30.  
  31.                 bind(descriptor, (struct sockaddr *)local_address, sizeof(struct sockaddr_in));
  32.         }
  33.  
  34.         {       /* Con esto indico que me quiero conectar al puerto 5200 de la IP 127.0.0.1 (localhost) */
  35.                 remote_address->sin_family = AF_INET;
  36.                 remote_address->sin_addr.s_addr = inet_addr("127.0.0.1");
  37.                 remote_address->sin_port = htons(5300);
  38.         }
  39.  
  40.         /* Me conecto al servidor */
  41.         connect(descriptor, (struct sockaddr *)remote_address , sizeof(struct sockaddr_in) );
  42.  
  43.  
  44. f1 = fopen ("1.jpg", "rb");
  45. if (f1==NULL)
  46. {
  47.    perror("No se puede abrir fichero.dat");
  48.    return -1;
  49. }
  50.  
  51. leidos = fread (buffer2, 1, 1024000, f1);
  52. sprintf(buf2,"%d",leidos);
  53.  
  54.         /* Le envio un Hola Mundo! */
  55.         send(descriptor, buf2, strlen(buf2) + 1, 0);
  56.     send(descriptor,buffer2, strlen(buffer2)+1,0);
  57.         /* Cierro el socket y por ende la conexion */
  58.         close(descriptor);
  59.  
  60.         free(local_address);
  61.         free(remote_address);
  62.  
  63.         return EXIT_SUCCESS;
  64. }


Servidor.c
Código C:
Ver original
  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <stdio.h>
  4. #include <sys/select.h>
  5. #include <sys/types.h>
  6. #include <sys/socket.h>
  7. #include <arpa/inet.h>
  8. #include <unistd.h>
  9.  
  10. #define SOCKET_MAX_BUFFER 100
  11.  
  12. int main(int argc, char **argv) {
  13.  
  14. FILE *f2;
  15.     char buf2[30];
  16.     char buffer2[1024000];
  17.    
  18.     int leidos;
  19.         int addrlen = sizeof(struct sockaddr_in);
  20.         char buffer[SOCKET_MAX_BUFFER];
  21.  
  22.         /* Creo el Socket: SOCK_STREAM para TCP y SOCK_DGRAM par UDP */
  23.         int descriptor = socket(AF_INET, SOCK_STREAM, 0);
  24.         int remote_client;
  25.  
  26.         /* Direccion Local */
  27.         struct sockaddr_in *local_address = malloc(sizeof(struct sockaddr_in));
  28.         /* Direccion remota ( a la que me quiero conectar )*/
  29.         struct sockaddr_in *remote_address = malloc(sizeof(struct sockaddr_in));
  30.  
  31.         {       /* Con esto fuerzo a que el puerto local sea el 5201 y que tome la IP por defecto de la PC */
  32.                 local_address->sin_family = AF_INET;
  33.                 local_address->sin_addr.s_addr = inet_addr("127.0.0.1");
  34.                 local_address->sin_port = htons(5300);
  35.  
  36.                 bind(descriptor, (struct sockaddr *)local_address, sizeof(struct sockaddr_in));
  37.         }
  38.  
  39.         /* Activo la escucha de conexiones entrantes a traves del puerto 5200 y como maximo 100 conexiones.*/
  40.         listen(descriptor, 100);
  41.  
  42.         /* Acepto nueva conexion entrante */
  43.         remote_client = accept(descriptor, (struct sockaddr *)remote_address, (void *)&addrlen);
  44.  
  45.         /* Leo e imprimo la informacion recivida a traves de la nueva conexion */
  46.         recv(remote_client, buf2, 30, 0);
  47.         ;
  48.     leidos = atoi(buf2);
  49.    
  50.  
  51. f2 = fopen ("nueva.jpg", "wb");
  52. if (f2==NULL)
  53. {
  54.    perror("No se puede abrir fichero.dat");
  55.    return -1;
  56. }
  57. recv(remote_client, buffer2, 1024000, 0);
  58.  
  59. fwrite (buffer2, 1, leidos, f2);
  60.  
  61.         /* Cierro el socket y por ende la conexion */
  62.         close(descriptor);
  63.  
  64.         free(local_address);
  65.         free(remote_address);
  66.  
  67.         return EXIT_SUCCESS;
  68. }


Que puede estar fallando
  #2 (permalink)  
Antiguo 23/06/2011, 10:36
Avatar de afrika026  
Fecha de Ingreso: junio-2011
Mensajes: 85
Antigüedad: 12 años, 9 meses
Puntos: 19
Respuesta: Envio de archivo binario a traves de socket

me parece que el error esta en esta linea correspondiente al servidor:

leidos = atoi(buf2);

lo que vos queres hacer con esta linea es saber el tamaño en numero INT de datos recibidos.
Pero el problema es que lo que estas haciendo con esta linea es convirtiendo todos los bytes recibidos y almacenados en "buf2" a INT, es decir a un numero entero.

La manera de que "leídos" tenga el tamaño que ocupan los datos almacenados por "buf2" es la siguiente:

leidos = sizeof(buf2) / sizeof(char);

ó

leidos = sizeof(buf2) / sizeof(buf2[0]);

con esto estas guardando en leidos la cantidad de elementos que tiene el array "buf2"

Etiquetas: binario, envio, 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 15:35.