Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Belial & Grimoire en 2 Noviembre 2011, 02:18 am



Título: ayuda con transferencia de archivos en C
Publicado por: Belial & Grimoire en 2 Noviembre 2011, 02:18 am
hola

estoy haciendo un programa para transferencia de archivos pero tengo unos problemas, a ver si alguien me puede ayudar

tengo el clasico cliente - servidor, el cliente me funciona perfectamente en linux pero a la hora de compilarlo en windows deja de funcionar y no tengo idea que podria ser

antes sabia como hacer transferencia en VB pero cuando inicie en C se me complicaron unas cosas, una de ellas fue como enviar la longitud del archivo a enviar

descubri hace poco que para eso se podia utilizar "htonl", cuando lo mando hago esto

Código
  1. longList = htonl(tam);

pero, al recibirlo lo pongo de esta manera en linux

Código
  1. recv(socket, (char *)buff, sizeof(long), 0);
  2. longbites = ntohl(*((long*) buff));

 y me funciona bien, pero a la hora de usarlo en windows me da un mensaje de error "xxxxxxxxxh el programa no puede "read", al principio crei que era por "fread" pero cuando quite esta parte del codigo, no me volvio a salir ese mensaje, pero como quite esa parte del codigo no obtuvo nada de datos

tenia entendido que tengo que desreferenciar buff, para que no convierta "ntohl" la direccion y el valor, y de esa manera solo se convierte el puro valor y como mencione, en linux, el cliente recibe la longitud bien, pero en windows me aparece un error, alguien sabe porque u otra manera de
hacerlo?

quedaria algo parecido la parte que en windows no funciona

Código
  1. while((connect(s, (struct sockaddr*)&cliente, tam)) < 0){
  2. printf("error connect");
  3. exit(1);
  4. }
  5.  
  6. recv(s, (char *)buff, sizeof(long), 0);
  7. longbites = ntohl(*((long*) buff));
  8.  
  9. FILE * fup = fopen("arreglo_transf.txt","wb");
  10.  
  11. if(longbites >= 0){
  12.  
  13.  
  14. while (i < longbites){
  15.  
  16. resiv = recv(s, buff, sizeof(buff), 0);
  17.  


Y tengo otra duda, tengo el cliente en linux por el momento y el servidor en windows, pero alguien sabe como puedo reiniciar o borrar datos de los sockets, porque me conecto y se me manda el archivo bien, pero a la hora de volver a descargarlo ya no se descarga nada.

en el servidor le puse un printf y alli cuando me vuelvo a conectar me aparece correcto la longitud del archivo, pero en el cliente le puse otro printf, para revisar como va la transferencia y me va mostrando "4 bytes enviados... etc" y la primera vez que lo hago me aparecen los datos bien, pero si lo vuelvo a ejecutar solo me aparece el archivo pero sin nada e incluso el cliente me dice "0 bytes enviados"

y en el servidor como les mencione, me aprecen las veces que lo intento la longitud del archivo pero no me manda nada, tengo que cerrar el servidor y volverlo a abrir, asi que la reconexion no creo que sea el problema, y la lectura del archivo me imagino que tampoco, pero no se manda ya nada despues desde el segundo intento

espero alguien me pueda ayudar con esto, salu2