[Risolto][C/C++] Che libreria SFTP consigliate?

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
emmanuel
Prode Principiante
Messaggi: 134
Iscrizione: giovedì 1 ottobre 2009, 22:08

Re: [c/c++] Libreria SFTP [risolto]

Messaggio da emmanuel »

fatto, allora,divido tutto il file in 200 bytes e li invio :

Codice: Seleziona tutto

unsigned int y=0;

ifstream fin(path, ios::binary);

if (fin) {
 fin.seekg(0, ios::end);
 ios::pos_type bufsize = fin.tellg(); // get file size in bytes
char* buf = new char[bufsize];
int x = bufsize;

while(x>200){
fin.seekg(y);
fin.read(buf,200);

sftp_write(file, buf,200);

y=y+200;
x-=200;
}
sftp_write(file, buf,x);
}

funziona, e' un po' lento, ma funziona
Ultima modifica di emmanuel il giovedì 13 luglio 2017, 22:06, modificato 1 volta in totale.
melfnt
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1312
Iscrizione: sabato 15 ottobre 2011, 22:25

Re: [c/c++] Libreria SFTP

Messaggio da melfnt »

emmanuel [url=https://forum.ubuntu-it.org/viewtopic.php?p=4995091#p4995091][img]https://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:fatto, allora,divido tutto il file in 200 bytes e li invio :

Codice: Seleziona tutto

unsigned int y=0;

ifstream fin(path, ios::binary);

if (fin) {
 fin.seekg(0, ios::end);
 ios::pos_type bufsize = fin.tellg(); // get file size in bytes
char* buf = new char[bufsize];
int x = bufsize;

while(x>200){
fin.seekg(y);
fin.read(buf,200);

sftp_write(file, buf,200);

y=y+200;
x-=200;
}
sftp_write(file, buf,x);
}

funziona, e' un po' lento, ma funziona
Perfetto!
Ora, tre cose:

1 - Visto che invii solo 200B alla volta non c'è bisogno che la variabile buffsize sia grande come la dimensione del file, ma bastano 200B (o uno in più per sicurezza), no?

2 - 200B sono un po' pochini, penso che la dimensione massima del pacchetto FTP sia un po' più grande. Prova a fare una ricerca in internet per scoprire quanto è questa dimensione e modifica il codice in modo che invii il massimo possibile di Byte alla volta. Questo risolverà anche il problema della lentezza.

3 - ora che hai un codice che funziona, ti consiglio di impacchettarlo in una funzione (diciamo ftp_send_whole_file) alla quale tu passi il file da mandare e lui lo manda tutto. Così avrai astratto tutta la parte di codice che spezzetta il file e non dovrai più occupartene in futuro: questo era il motivo per cui avevi aperto questo topic!

(;
ixamit
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 499
Iscrizione: giovedì 14 novembre 2013, 10:16

Re: [c/c++] Libreria SFTP

Messaggio da ixamit »

Non conosco il C++ e potrei dire stupidate, comunque:
* non serve fare la seekg prima delle read, lo stream dovrebbe mantenere l'ultima posizione
* la write (o sftp_write) dovrebbe scrivere esattamente il numero di bytes letti, non la dimensione del blocco
* sftp trasmette i pacchetti via SSH e da quello che leggo dall'rfc 4253 il payload deve essere al massimo 32768 bytes

Per il resto vedo che il problema è stato risulto :birra:
emmanuel
Prode Principiante
Messaggi: 134
Iscrizione: giovedì 1 ottobre 2009, 22:08

Re: [c/c++] Libreria SFTP

Messaggio da emmanuel »

infatti mi correggo, ho fatto prove e sono passato a pacchetti da 160000, si in realta' tutta la funzione e' scritta in un solo foglio chiamato "files.cpp" dove gli passo solo la path the file e lui fa il resto cosi lo posso riutilizzare, mi piacerebbe condividere tutto il programma almeno cosi' tutti possono darmi consigli come te :)

grazie anche a te Ixamit, ho provato varie dimensioni e la migliore funzionante e' 160000
melfnt
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1312
Iscrizione: sabato 15 ottobre 2011, 22:25

Re: [c/c++] Libreria SFTP

Messaggio da melfnt »

ixamit [url=https://forum.ubuntu-it.org/viewtopic.php?p=4995185#p4995185][img]https://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto: * sftp trasmette i pacchetti via SSH e da quello che leggo dall'rfc 4253 il payload deve essere al massimo 32768 bytes
Giusto, ma il payload sftp potrebbe essere diverso da quello ssh (non è questo il caso), inoltre potrebbero esserci altri vincoli dovuti alla libreria usata.
emmanuel ha scritto:infatti mi correggo, ho fatto prove e sono passato a pacchetti da 160000, si in realta' tutta la funzione e' scritta in un solo foglio chiamato "files.cpp" dove gli passo solo la path the file e lui fa il resto cosi lo posso riutilizzare, mi piacerebbe condividere tutto il programma almeno cosi' tutti possono darmi consigli come te :)

grazie anche a te Ixamit, ho provato varie dimensioni e la migliore funzionante e' 160000
Niente, se vuoi condividere il codice fai pure, magari apri un'altra discussione se il problema è un altro.
(;
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: Google [Bot] e 16 ospiti