Newsgroup: it.comp.os.linux.development
Titolo: SOCKETS & FILE

...salve a tutti :)
ho avuto occasione di leggere recentemente un thread sullo stesso argomento 
x il quale adesso posto (socket e ftp) ma senza trovare nessun aiuto... i 
link proposti non mi sono stati di aiuto sufficiente.. e cmq necessitavo di 
+ chiarimenti... cmq vengo al punto. Come si trasferiscono i file con i 
socket?? cerco di essere più chiaro... la maggiornaza dei tutorial che 
trovo parlano solo di come spedire e ricevere stringhe... ma se io volessi 
trasferire un file in formato binario esattamento come succede con l'ftp? 
...ho provato in qualche modo, utilizzando i socket come degli stream e 
gestendoli esattamente come dei file, un metodo piuttosto comune che 
credevo potesse facilitarmi la vita. In ogni caso non sono riuscito nel mio 
intento... 
ringrazio chiunque avesse la pazienza di rispondere... anche solo con un 
link... (anzi... preferbilmente! :) )
-- 
...in the deep of a mind insane...
...fantasy and reality are the same...

x il quale adesso posto (socket e ftp) ma senza
trovare nessun aiuto... i
---[CUT]---
Rispondo anche se non sono un
"guru" della programmazione, ma recentemente
ho dovuto risolvere lo stesso
problema. L'ho risolto usando il tutorial a cui ti riferisci. Il metodo che
ho usato è abbastanza semplice (anche se sono sicuro che non è il migliore
in termini di efficienza e velocità):
apri il file e lo leggi con una
normale fread. Inserisci il contenuto in un buffer di lunghezza arbitraria
e spedisci il buffer. Ripeti il processo finché non raggiungi la fine del
file (EOF).
Se ti servisse la parte del codice che ho usato io, dillo,
che lo posto.
Ciao, mick.
p.s. Spero che qualcuno più esperto di me
risponda, potrò così migliorare il mio metodo.
--------------------------------
Inviato via 
http://usenet.iol.it
 

mick wrote:

...il tuo metodo funziona! ...ma non mi sembra utile x cio che voglio fare 
io :[ ...a "spedire" un file cosi ci ero già riuscito.... a me interessava 
riprodurre esattamente ciò che succede con un server ftp... qui invece il 
buffer viene scaricato sulla schermata del client, in questo caso telnet... 
a me interessa che il file venga spedito in modo tale che il client possa 
averne una copia nella sua dir...insomma, la stessa cosa che succede quando 
si scarica un file qualsiasi da un server qualsiasi non so se mi sono 
spiegato... se non capisci fammelo presente, e cercherò di essere più 
chiaro ok? cmq GRAZIE :)


chiaro ok? cmq GRAZIE :)
---[CUT]---
Non ho capito esattamente quali sono le tue specifiche. Comunque riporto il
codice che ho implementato io. Spero ti possa essere utile:
/*Inizio del
codice contenuto nel server.*/
printf("\nInvio del file %s in
corso........\n",nomefile);
    f=fopen(nomefile,"rb");
    if(f==NULL) {
printf("\nImpossibile aprire il file. File inesistente!\n");
exit(-1);
    }
    while(feof(f)==0) {
fread(buffer,1,MAXBUFFER,f);
send(descrittore_socket,buffer,strlen(buffer),0);
    }
    fclose(f);
printf("\nFile %s inviato al server!\n",nomefile);
}
/*Fine del codice*/
Le variabili usate sono queste:
buffer[] è il buffer che contiene i dati
da spedire.
nomefile[] contiene il nome del file da spedire.
descrittore_socket è il descrittore del socket.
f è il puntatore al file.
Ovviamente, prima di questa fase, dovrai spedire anche il nome del file
stesso, per far si che questo possa essere scritto correttamente, con il
suo nome. 
In questo modo il file viene "duplicato", nel senso che una
copia viene spedita al client, e l'originale rimane al server.
Questo
metodo spedisce un file usando il protocollo TCP e non l'UDP. Se vuoi usare
quest'ultimo devi modificare alcuni parametri, e devi usare al posto di
send() la funzione sendto().
Ciao, mick.



ok x il codice... tnx ancora... ma x trasferire un file il tuo server ha 
bisogno di un client apposito giusto? ..credo che la differenza stia 
proprio qui... io ho bisogno di un server in grado di rispondere ad un 
comando del tipo "get nomefile" da un client telnet qualsiasi... hai 
qualche idea in proposito??? :)


qubik wrote:

Non la ho mai usata ma dovrebbe fare al caso tuo sendfile:
#include <unistd.h>
int sendfile(int out_fd, int in_fd, off_t *offset, size_t count)
Ciao,
Luca.

 buffer viene scaricato sulla schermata del client, in questo caso telnet... 
In questo caso il problema e` del  client :)) 
Il tuo  client [1] deve  mandare il comando  port, aprire in  listen una
porta alta,  inviare retr,  il server  a questo  punto si  connette alla
porta specificare ed invia il file.
C --> listen 12345
C -- port --> S(porta 21)
S(20) -- connessione --> C(porta 12345)
C -- retr --> S(porta 21)
S(20) -- file --> C(porta 12345)
Per  l'invio di  file  puoi  anche usare  la  funzione sendfile(3),  che
permette  di  velocizzare  il  procedimento  riducendo  le  chiamate  al
sistema.
[1] Se non vuoi costruirti un  client, puoi inviare i comandi con telnet
e rivecere i dati con nc.
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Sono un mirabile incrocio tra Tarzan e Giacomo Leopardi.
In me convivono tutte le doti intelluttuali di Tarzan e
tutta la prestanza fisica di Giacomo Leopardi.
A. Borsani