Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [c++] Inviare un File con WinSock

    Ciao..

    Il mio problema e quello di dover inviare un file da un clientsocket a un serversocket. Fino a ora ho mandato solo messaggi di testo.

    Ho trovato l'API TrasmitFile ma non mi funziona, ho provato a cercare in inetrnet e anche in questo forum, però gli aiuti che ho trovato non funzionano.

    So che ce il modo di inviare il file come una stringa di byte (con il metodo send()) però penso sia una cosa abbastanza complessa per via delle possibili perdite di dati.

    Aiutatemi voi.....
    Il linguaggio migliore e quello che ti crei da solo...

  2. #2

    Re: [c++] Inviare un File con WinSock

    Originariamente inviato da Akira86
    So che ce il modo di inviare il file come una stringa di byte (con il metodo send()) però penso sia una cosa abbastanza complessa per via delle possibili perdite di dati.

    Aiutatemi voi.....
    Se usi TCP (SOCK_STREAM) la possibilità di perdite di dati non è un problema, se ne occupa lui di gestire la ritrasmissione degli eventuali pacchetti danneggiati, di prevenire trasmisioni multiple e del riordino dei pacchetti.
    Sostanzialmente TCP ti garantisce uno stream (flusso) affidabile (senza errori) di byte.
    L'unica cosa che non garantisce è la conservazione dei confini tra i messaggi (message boundaries), cioè non è un protocollo come UDP orientato ai messaggi.
    Per questo motivo dovrai scriverti usare queste funzioni (copia e incolla)
    http://www.lilik.it/~mirko/gapil/gap...4-30900015.3.1

    dai un'occhiata qui se hai dubbi sui socket (su TCP)
    http://www.lilik.it/~mirko/gapil/gap...#x591-29200015

  3. #3
    Utente di HTML.it L'avatar di Xadoom
    Registrato dal
    Dec 2002
    Messaggi
    1,491
    In effetti quello che devi fare per inviare un file è proprio inviare del testo....leggi il file a stringhe di tot caratteri e poi le inviii...lato client leggi e scrivi il file...io ho già implementato una cosa così, quando posso te la posto.
    Windows Xp
    [Java]
    [PHP]Notepad++
    [Fortran90-77] elf90 g77
    [C++ /WinAPI] DevC++ VisualC++

  4. #4
    Grazie a tutti e due per le risposte.

    Ora guardo i link di internet.

    Comunque, per Xadoom, se mi posti del codice è altrettanto ben accetto...


    Grazie ancora.. Ciao Ciao.
    Il linguaggio migliore e quello che ti crei da solo...

  5. #5
    Utente di HTML.it L'avatar di Xadoom
    Registrato dal
    Dec 2002
    Messaggi
    1,491
    Allora lato server invio il file:
    codice:
    char      buffer[4096];
       DWORD     dwRead;
       
       /*Invio del nome del file*/
       h = FindFirstFile(temp,&fd); 
       if(h == INVALID_HANDLE_VALUE){
        /*Se il file indicato non esiste*/
        send(s,END_ERROR,5,0);
        return CONNECTED;
       }
       send( s, fd.cFileName, MAX_PATH, 0 );
       
       /*Invio del file*/
       h = CreateFile(temp,GENERIC_READ, FILE_SHARE_READ, NULL,OPEN_EXISTING, 0, NULL);
       if(h != INVALID_HANDLE_VALUE)
          {      
           dwRead=0;
           while ( ReadFile(h, buffer, sizeof(buffer), &dwRead, NULL) )
           {
            if ( dwRead > 0 )send(s, buffer, dwRead, 0);
            else  break;
           }   
          Sleep(2000);
          send(s,END_NO_ERROR,5,0);
       }
       CloseHandle(h);
    Quando il file è finito invio una certa stringa (che io ho qui indicato con END_NO_ERROR).
    Lato client lo salvo, questo metodo è chiamato in modo iterativo, ad ogni ricezione del buffer controllo, se la stringa non equivale a END_NO_ERROR allora chiamo il metodo:
    codice:
    bool download(){
    /*Sta ricevendo il file richiesto*/             
     if(newFile==true){
     /*Se è un nuovo file crealo*/
      lstrcpy(charbuff,szDir);
      lstrcat(charbuff,recvbuf);
      hFile = CreateFile(charbuff,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,0,NULL);        
      newFile=false;  //Il file è stato creato
      return false;   //La creazione del file non deve essere vista come ricezione di byte
     }
     /*Scrivi sul file*/
     if(WriteFile(hFile,recvbuf,sockByte,&dw,NULL)==0){
       wsprintf(charbuff,"Errore in scrittuta numero %i",GetLastError());
       return false;
       }
     /*Incrementa l'indice del file su cui scrivi*/ 
     else return true;
    }
    Mi spiace tanto che questi metodi sono tirati fuori da un mio programma e quindi possono risultare confusi....spero comunque ti siano di un qualche aiuto.
    Windows Xp
    [Java]
    [PHP]Notepad++
    [Fortran90-77] elf90 g77
    [C++ /WinAPI] DevC++ VisualC++

  6. #6
    Grazie Mille..

    Sei stato gentilissimo...

    Ora mi metto all'Opera...

    Il linguaggio migliore e quello che ti crei da solo...

  7. #7
    Utente di HTML.it L'avatar di Xadoom
    Registrato dal
    Dec 2002
    Messaggi
    1,491
    Di nulla...se hai qualche problema posta pure.
    Buon lavoro
    Windows Xp
    [Java]
    [PHP]Notepad++
    [Fortran90-77] elf90 g77
    [C++ /WinAPI] DevC++ VisualC++

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.