Ver Mensaje Individual
  #5 (permalink)  
Antiguo 08/05/2005, 16:30
netoec84
 
Fecha de Ingreso: julio-2004
Ubicación: Quito
Mensajes: 123
Antigüedad: 20 años, 8 meses
Puntos: 0
Entiendo, pero ahora tengo otra duda, si lee un buffer del tipo char[] para pasar los datos y el archivo que se pasa es una imagen o un zip o un ejecutable y he visto que estos archivos contienen caracteres "raros" que sucede si uno de ellos es el caracter "fin de cadena" y este esta en una posicion media del arreglo (buffer char[]). Esto no produciria que la informacion llegue alterada?

Para que quede mas claro les pongo el codigo que tengo... funciona para cualquier archivo? he usado para texto, imagen .jpg y un zip. Aparentemente funciona, pero tengo la duda que expuse arriba.

SERVIDOR
Código:
#include <stdio.h>
#include <sys/types.h> 
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/fcntl.h>

void dostuff(int); 

void error(char *msg)
{
    perror(msg);
    exit(1);
}

int main(int argc, char *argv[])
{
     int sockfd, newsockfd, portno, clilen, pid;
     struct sockaddr_in serv_addr, cli_addr;

     if (argc < 2) {
         fprintf(stderr,"ERROR, no se ha ingresado el puerto\n");
         exit(1);
     }
     sockfd = socket(AF_INET, SOCK_STREAM, 0);

     if (sockfd < 0) 
        error("ERROR opening socket");

     bzero((char *) &serv_addr, sizeof(serv_addr));
     portno = atoi(argv[1]);
     serv_addr.sin_family = AF_INET;
     serv_addr.sin_addr.s_addr = INADDR_ANY;
     serv_addr.sin_port = htons(portno);

     if (bind(sockfd, (struct sockaddr *) &serv_addr,
              sizeof(serv_addr)) < 0) 
              error("ERROR en binding");

     listen(sockfd,5);

     clilen = sizeof(cli_addr);

     while (1) {
         newsockfd = accept(sockfd, 
               (struct sockaddr *) &cli_addr, &clilen);
         if (newsockfd < 0) 
             error("ERROR en accept");
         pid = fork();
         if (pid < 0)
             error("ERROR en fork");
         if (pid == 0)  {
             close(sockfd);
             dostuff(newsockfd);
             exit(0);
         }
         else close(newsockfd);
     } 
     return 0; 
}

void dostuff (int sock)
{
   int n;
   char buffer[256];
   char ruta[256];
   
   //Descriptores de archivos 
   int d_open, d_readbytes;

   //Buffer
   char buf[1024];   
   
   // Envia por socket el mensaje de ingreso de archivo
   n = write(sock,"Ingrese el archivo a copiar",28);
   if (n < 0) error("ERROR escribiendo en el socket");   

   // Lee la ruta del archivo...         
   bzero(ruta,256);
   n = read(sock,ruta,255);
   if (n < 0) error("ERROR leyendo del socket");
   
   // Abrir el fichero de entrada en lectura y binario
   printf("Se solicito el archivo: %s", ruta);
   d_open = open(ruta, O_RDONLY);
   
   while(1)
   {
	//Se lee el contenido del archivo
	d_readbytes = read(d_open, buf, 1024);
	if(d_readbytes <= 0)
		break;
	//Se escribe en el socket la información leída
	write(sock, buf, d_readbytes);
	//printf("%s", buf);
   }   
   n = write(sock,"",0);
   

   close(sock);

}


CLIENTE
Código:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h> 
#include <sys/fcntl.h>

void error(char *msg)
{
    perror(msg);
    exit(0);
}

int main(int argc, char *argv[])
{
    int sockfd, portno, n;
    struct sockaddr_in serv_addr;
    struct hostent *server;
    char buffer[256];
    char ruta[256];
    char aux[] = {"cpy_"};
    

   //Buffer
   char buf[1024];  
   int fd;
    
    if (argc < 3) {
       fprintf(stderr,"uso %s host puerto\n", argv[0]);
       exit(0);
    }

    portno = atoi(argv[2]);
    sockfd = socket(AF_INET, SOCK_STREAM, 0);

    if (sockfd < 0) 
        error("ERROR opening socket");

    server = gethostbyname(argv[1]);

    if (server == NULL) {
        fprintf(stderr,"ERROR, no existe el host\n");
        exit(0);
    }
    bzero((char *) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    bcopy((char *)server->h_addr, 
         (char *)&serv_addr.sin_addr.s_addr,
         server->h_length);
    serv_addr.sin_port = htons(portno);

    if (connect(sockfd,&serv_addr,sizeof(serv_addr)) < 0) 
        error("ERROR conectando");

    //lee el mensaje del servidor
    bzero(buffer,256);
    n = read(sockfd,buffer,255);
    if (n < 0) error("ERROR leyendo del socket");
    printf("%s\n",buffer);	
	
    //Envia el nombre del archivo que se quiere descargar
    bzero(buffer,256);
    fgets(buffer,255,stdin);
    strcpy(ruta, buffer);
    strcat(aux, ruta);
    strcpy(ruta, aux);
    n = write(sockfd,buffer,strlen(buffer)-1);
    if (n < 0) error("ERROR escribiendo en el socket");

    if ((fd=creat(ruta,0644))==-1)
	printf("\nno puede crear\n");
    
    //lee el mensaje del servidor
    while(1)
    {
    	bzero(buf,1024);
    	n = read(sockfd,buf,1023);
    	if (n<=0)
		break;
		
	if (write (fd,buf,n) !=n)
		printf("\nerror al escribir\n");
    }
        

    close(fd);
    return 0;
}


Saludos
__________________
Guia Telefonica
ecuadorMusical.com