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

Problemas con la transferencia de bytes en linux

Estas en el tema de Problemas con la transferencia de bytes en linux en el foro de C/C++ en Foros del Web. Hola, tengo un problema con la transferencia de archivos en linux. cuando corro mi programa de forma local no tengo ningun problema en absoluto, sin ...
  #1 (permalink)  
Antiguo 22/11/2010, 17:48
 
Fecha de Ingreso: noviembre-2010
Mensajes: 1
Antigüedad: 12 años
Puntos: 0
Exclamación Problemas con la transferencia de bytes en linux

Hola, tengo un problema con la transferencia de archivos en linux.

cuando corro mi programa de forma local no tengo ningun problema en absoluto, sin embargo si trato de ejecutarlo dentro de mi red local, nunca puedo superar los 3000 bytes, o incluso antes de que llegue a esa cantidad, el proceso que tiene el recv, ya no lee el mensaje completo y termina.

Aqui les dejo mi codigo, espero alguien pueda ayudarme!
Ambos codigos se ejecutan desde consola con un solo argumento: la direccion ip donde se ejecuta el programa receptor

CODIGO DEL RECEPTOR

#define PORT 8008
#define FILEMSG_BYT 256
typedef struct _file_msg{
int flag;
int bytes;
unsigned char data[FILEMSG_BYT];
} file_msg;
file_msg fmsg;

void init_server(char *server_ip, int *server_sock){
struct sockaddr_in server_addr;

if((*server_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0){
perror("socket_server");
exit(-1);
}

server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(server_ip);
server_addr.sin_port = htons(PORT);

if(bind(*server_sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr_in)) < 0){
perror("bind");
exit(-4);
}

if(listen(*server_sock, 15) < 0){
perror("listen");
exit(-5);
}
}

int main(int argc, char *argv[]){
int server_sock, remote_sock, client_size, fd;
struct sockaddr_in server_addr, client_addr;
int bytes = 0;

if(argc < 2){
printf("Usage: %s <ServerHostIP>\n", argv[0]);
exit(-1);
}

init_server(argv[1], &server_sock);

client_size = sizeof(struct sockaddr_in);

do{
//Espera a una solicitud de conexion
if((remote_sock = accept(server_sock, (struct sockaddr *) &client_addr, &client_size)) < 0){
perror("accept");
exit(-2);
}
fd = open("loquesea.mp3", O_WRONLY | O_TRUNC | O_CREAT, 0777);
do{
puts("prueba");
if(recv(remote_sock, &fmsg, sizeof(file_msg), 0) != sizeof(file_msg)){
puts("Error en la tranferencia");
perror("aqui");
pthread_exit(NULL);
}
if(fmsg.flag == -1){
puts("No se pudo copiar el archivo");
pthread_exit(NULL);
}
if(write(fd, fmsg.data, fmsg.bytes) < 0){
puts("No fue posible realizar la copia del contenido");
pthread_exit(NULL);
}
bytes += fmsg.bytes;
if(fmsg.flag == 0)
break;
} while(1);
close(fd);
} while(1);

return 0;
}





ESTE ES EL CODIGO DEL EMISOR

#define PORT 8008
#define FILEMSG_BYT 256
char *user;

typedef struct _file_msg{
int flag;
int bytes;
unsigned char data[FILEMSG_BYT];
} file_msg;

int init_connection(const char* host){
struct sockaddr_in nserver_addr;
int client_fd;

if((client_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
perror("socket_client");
exit(-1);
}

nserver_addr.sin_family = AF_INET;
nserver_addr.sin_addr.s_addr = inet_addr(host);
nserver_addr.sin_port = htons(PORT);

if(connect(client_fd, (struct sockaddr*)&nserver_addr, sizeof(struct sockaddr_in)) < 0){
perror("connect");
exit(-1);
}

return client_fd;
}

int main(int argc, char *argv[]){
int remote_sock, fd;
struct stat fileInfo;
file_msg fmsg;
int num_msgs, i;

remote_sock = init_connection(argv[1]);
fd = open("UGNQ.mp3", O_RDONLY);

if(fstat(fd, &fileInfo) != 0){
perror("fstat");
pthread_exit(NULL);
}

num_msgs = fileInfo.st_size / FILEMSG_BYT;
fmsg.flag = 1;
//El numero de mensajes que se enviaran es num_msgs + 1
for(i = 0 ; i <= num_msgs ; i++){
if(i == num_msgs)
fmsg.flag = 0;
fmsg.bytes = read(fd, fmsg.data, FILEMSG_BYT);
if((fmsg.bytes) < 0){
fmsg.flag = -1;
}
puts("lala");
if(send(remote_sock, &fmsg, sizeof(file_msg), 0) != sizeof(file_msg)){
perror("send");
pthread_exit(NULL);
}
if(fmsg.flag == -1){
puts("segun yo aqui salio");
pthread_exit(NULL);
}
}

return fileInfo.st_size;

return 0;
}

Etiquetas: linux, recv, send, 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 10:30.