PDA

Visualizza la versione completa : [C\C++] mandare un file via socket


Infernal
19-12-2008, 17:29
Ho bisogno di trasferire dei file da un client a un server via socket... ho pensato di leggere tutto il file con fread, mandarlo con send e poi riscriverlo dall'altra parte con fwrite... può funzionare? ci sono metodi più ortodossi per farlo?

menphisx
19-12-2008, 19:19
Si può funzionare.

Infernal
19-12-2008, 20:40
ok.. mi metto all'opera... grazie mille.. :D :D

:ciauz:

menphisx
19-12-2008, 20:56
Magari usa due socket: una per i comandi e una per l'invio file.
È molto comodo sapere la dimensione del file PRIMA di scaricarlo.
Su una socket scrivi:
NAM file.txt
DIM 2478392835
COD ASCII #oppure BIN

Sull'altra socket leggerai DIM bytes, aprira il file NAM con codifica COD.

Infernal
20-12-2008, 00:23
Scusa ma non ho capito, io ho pensato di fare così:

dal client scrivo:

SEND FILE ciao.txt
DIM 253445353
e poi i dati... (la cidifica non la metto perchè è sempre bin)

e dal server leggo tutto e scrivo su un file... non capisco dove usare la seconda socket

MItaly
20-12-2008, 00:35
Il concetto sarebbe di usare due connessioni separate, una per i comandi e l'altra per i dati; dopo il DIM il server resterebbe in attesa su un'altra porta per la connessione dati, da cui otterrebbe il file in questione. In ogni caso puoi tranquillamente fare come hai detto tu.

Infernal
20-12-2008, 00:40
ah... ora ho capito. Ma (per curiosità) che vantaggi porta lo scrivere i dati su di una seconda socket?

MItaly
20-12-2008, 00:44
Puoi fare altro sulla connessione di controllo mentre i dati vengono trasferiti e puoi trasferire più file alla volta. Il protocollo FTP in effetti funziona proprio così.

Infernal
20-12-2008, 00:58
Ah-ah.... ecco il trucco. =) vabbè.. io devo mandare un file per volta e solo quello... grazie comunque...se dovesse servirmi lo terrò presente..

bye

menphisx
20-12-2008, 01:02
Originariamente inviato da Infernal
ah... ora ho capito. Ma (per curiosità) che vantaggi porta lo scrivere i dati su di una seconda socket?

È più comodo.
Su una socket sai che arriveranno solo comandi, sull'altra sei sicuro arriveranno solo dati.
Se usi una sola socket, invece diventa più complicato gestire comandi e dati separatamente.
Ad esempio se usi come separatore tra comandi e dati il doppio newline, può capitare che un file abbia doppio newline, e allora la ricezione si interrompe a metà file. Si può ovviare reinviando i dati, ma come vedi diventa complesso.

Loading