
08/05/2005, 16:30
|
| | 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 |