Ver Mensaje Individual
  #1 (permalink)  
Antiguo 19/06/2011, 16:35
joandoc
 
Fecha de Ingreso: mayo-2006
Mensajes: 79
Antigüedad: 17 años, 11 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