Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    434

    [C++] Invio file con send() e recv()

    Ciao a tutti,
    sto provando a scrivere un piccolo programma che permetta ad un server di inviare al client un file qualunque di x bytes attraverso le funzioni send() e recv().

    Ho cercato sul forum e nella rete, e sono arrivato alla conclusione (correggetemi se sbaglio) che questa è la procedura da utilizzare:

    Server:
    [list=1][*]Aprire il file in input[*]read() il contenuto del file e metterlo in un buffer temporaneo[*]Inviare il buffer con send()[*]"Loopare" gli ultimi 2 punti fino a che buf == file.eof()[/list=1]

    Client:
    [list=1][*]Aprire un file in output[*]recv() il buffer[*]write() sul file[*]"Loopare" gli ultimi 2 punti fino a che il server invia dati.[/list=1]

    A questo punto mi stavo chiedendo:
    a) sarebbe opportuno inviare insieme al buffer un numero che permetta al client di riordinare e ricostruire i frammenti (uso SOCK_STREAM)? Ad esempio mettere il buffer in una struttura con un membro int n_ordine

    b) quanto deve essere grande il buffer? Devo occuparmi in qualche modo dell'incapsulazione?

    c) eventuali controlli sull'integrità?

    Avevo scritto qualche riga ma evito di appesantire ulteriormente il topic, tanto funziona talmente male che forse conviene che prima mi faccia un'idea più chiara in merito. Poi lo faccio per imparare, se me lo correggete voi non c'è gusto

    Sono ben accetti anche documenti da leggere.


  2. #2
    Del punto a) dovrebbe occuparsene l'IP
    Del punto c) dovrebbe occuparsene il TCP

    Per la domanda b) dipende da quanto grossi sono i file che devi mandare.
    Dipende se li vuoi mandare un byte alla volta o a gruppi.
    Ci sono 10 tipi di persone al mondo, chi conosce il sistema binario e chi no.

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    434
    La dimensione dei file non è nota a priori, possono essere di 500Kb così come di 500Mb.

    Cosa intendi per "un byte alla volta oppure a gruppi"?

    Vorrei dividere il file in meno parti possibili, senza quindi aver bisogno di mandare un numero di pacchetti eccessivo.

  4. #4
    Ciao a tutti,
    sto provando a scrivere un piccolo programma che permetta ad un server di inviare al client un file qualunque di x bytes attraverso le funzioni send() e recv().

    Ho cercato sul forum e nella rete, e sono arrivato alla conclusione (correggetemi se sbaglio) che questa è la procedura da utilizzare:

    Server:


    1. Aprire il file in input
    2. read() il contenuto del file e metterlo in un buffer temporaneo
    3. Inviare il buffer con send()
    4. "Loopare" gli ultimi 2 punti fino a che buf == file.eof()



    Client:


    1. Aprire un file in output
    2. recv() il buffer
    3. write() sul file
    4. "Loopare" gli ultimi 2 punti fino a che il server invia dati.



    A questo punto mi stavo chiedendo:
    a) sarebbe opportuno inviare insieme al buffer un numero che permetta al client di riordinare e ricostruire i frammenti (uso SOCK_STREAM)? Ad esempio mettere il buffer in una struttura con un membro int n_ordine

    b) quanto deve essere grande il buffer? Devo occuparmi in qualche modo dell'incapsulazione?

    c) eventuali controlli sull'integrità?

    Avevo scritto qualche riga ma evito di appesantire ulteriormente il topic, tanto funziona talmente male che forse conviene che prima mi faccia un'idea più chiara in merito. Poi lo faccio per imparare, se me lo correggete voi non c'è gusto

    Sono ben accetti anche documenti da leggere.
    a) superfluo, è TCP ad occuparsente.
    b) in genere è bene settare un buffer che sia una potenza di 2 (512, 1024, 2048 o 4096 bytes)
    Dell'incapsulazione con gli altri layer sarà socket stesso ad occuparsene.
    c) li fa gia TCP.

    Consiglio che ho dato anche tempo fa: fare tutto questo 'manualmente' è sconveniente. Decisamente meglio utilizzare un framework ad alto livello che possibilmente implementi capacità di buffering in ricezione e trasmissione.
    Rilasciata Python FTP Server library 0.5.1
    http://code.google.com/p/pyftpdlib/

    We'll be those who'll make the italian folks know how difficult can be defecating in Southern California without having the crap flying all around the house.

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    434
    In che senso sconveniente? Se il problema è che richiede solo del tempo in più non è realmente un problema visto che non ho scadenze da rispettare.

    Esempio di framework ad alto livello? Una libreria tipo libcurl? (sto scrivendo sotto linux)

  6. #6
    In che senso sconveniente?
    http://forum.html.it/forum/showthrea...ight=framework

    Esempio di framework ad alto livello?
    http://www.kegel.com/c10k.html#frameworks (questi sono asincroni)

    Una libreria tipo libcurl?
    Non proprio.
    Rilasciata Python FTP Server library 0.5.1
    http://code.google.com/p/pyftpdlib/

    We'll be those who'll make the italian folks know how difficult can be defecating in Southern California without having the crap flying all around the house.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.