PDA

Visualizza la versione completa : [C] Inviare files


starcraftworld
16-12-2008, 18:05
Ciao!
Vorrei scrivere un programma in C che consenta di inviare un file di qualunque tipo dal client al server. Come posso fare?

MItaly
16-12-2008, 18:09
Il primo passo la creazione del protocollo tramite il quale intendi trasmettere i dati, o l'implementazione di un client e di un server conformi ad un protocollo gi esistente.

starcraftworld
16-12-2008, 18:11
Meglio la seconda.
Che protocollo mi conviene usare per una trasmissione rapida e sicura?

MItaly
16-12-2008, 18:20
TFTP (http://en.wikipedia.org/wiki/Trivial_File_Transfer_Protocol) non particolarmente sicuro (non supporta autenticazione e cifratura, ma forse tu per "sicuro" intendevi qualcos'altro), ma molto semplice e piuttosto veloce (non compresso, ma invia pochissimi dati oltre agli effettivi dati del file).
---EDIT---
Ma forse se vuoi "spedire" dei dati pi che prelevarli ti conviene usare qualche altro protocollo pi semplice ancora, puoi anche semplicemente inventarlo tu.

starcraftworld
16-12-2008, 18:26
come faccio ad inventarmi un protocollo?

MItaly
16-12-2008, 21:31
Scrivendone le specifiche ed implementandolo. :fagiano: Un protocollo ad esempio pu essere del tipo:

il server resta in ascolto su una determinata porta;
il client si connette alla porta e invia un qualche messaggio di "saluto" convenzionale, eventualmente seguito dalla versione del client e attende la risposta del server;
il server risponde in maniera analoga, magari dicendo anch'esso la sua versione;
(opzionale) il client comunica che ha intenzione di inviare un file e attende una risposta;
(opzionale) il server conferma che in grado di effettuare l'operazione;
il client comunica il nome del file che intende inviare e attende una risposta;
il server conferma che ha ricevuto il nome;
il client comunica le dimensioni del file e attende una risposta;
il server conferma che ha ricevuto le dimensioni del file;
il client invia tutto il file;
il server quando arrivato tutto il file comunica che ha ricevuto il file e chiude la connessione.

Supponendo di realizzare un protocollo "human readable", con ritorni a capo come separatori richiesta-risposta, un esempio di "conversazione" pu essere questa (in rosso il client, in verde il server):


HELLO NomeClient 0.4.2.71
HELLO NomeServer 0.3.6.12
SENDFILE
OK
NomeFile.txt
OK
14
OK
Hello World![NUL] (qui come NUL intendo ovviamente il carattere 0, situato al termine di ogni file ASCII)
OK
.
Sarebbe anche buona cosa implementare un sistema di messaggi di errore:


asdasdasdas
ERROR 1 Invalid handshake


HELLO NomeClient 0.4.2.71
HELLO NomeServer 0.3.6.12
asdasdsad
ERROR 2 Invalid command



HELLO NomeClient 0.4.2.71
HELLO NomeServer 0.3.6.12
SENDFILE
OK
Noe?|*asde.tx\\t
ERROR 3 Invalid filename



HELLO NomeClient 0.4.2.71
HELLO NomeServer 0.3.6.12
SENDFILE
OK
NomeFile.txt
OK
asgaegasagae
ERROR 4 Invalid file size

Loading