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;
}