Pagina 2 di 2
Re: [C] problema fscanf
Inviato: domenica 14 giugno 2015, 13:39
da gila75
Di socket purtroppo non ne so nulla, devo ancora studiarli, quindi dobbiamo aspettare.
Non so,read e write sono primitive più a basso livello, e se non erro non bufferizzate.
Ripeto socket, pipes ecc.. li devo ancora studiare.
Ma non ho capito se come hai fatto ora funziona o no
Re: [C] problema fscanf
Inviato: domenica 14 giugno 2015, 16:01
da vbextreme
ho cercato di semplificare il framework e quindi ad ogni header corrisponde una libreria che va linkata con l'apposito flag "-leasy..."
volevo solo sottolineare che la modalità binaria è solo un metodo MS, in linux non esiste, vengono trattati i file alla medesima maniera, ovviamente se si legge una stringa ci si fermerà al primo \0.
Adesso non ho il tempo necessario per analizzare il codice ma sicuramente ci sarà un semplicissimo errore logico causato da dall'ennesima funzione "antipatica"
buona domenica
Re: [C] problema fscanf
Inviato: domenica 14 giugno 2015, 16:52
da gila75
Ultimo mio intervento, lascio la parola agli altri per non confondere l'utente ma:
volevo solo sottolineare che la modalità binaria è solo un metodo MS, in linux non esiste, vengono trattati i file alla medesima maniera, ovviamente se si legge una stringa ci si fermerà al primo \0.
Non ho capito. Intendevo che magari cercava di copiare\inviare un file non testuale in modalità non binaria.
Come si fa se non copiando semplicemente bytes (cioè modo binario) per esempio a copiare un mp3 per esempio?
Evidentemente ho le idee confuse anche io
Ho sempre usato quel modo, anche per copiare intere directory...e ora ho la sorpresa
Re: [C] problema fscanf
Inviato: domenica 14 giugno 2015, 19:10
da errullaiolo
Non ci crederete ma ce l'ho fatta
L'ho testato con una miriade di file, il più grande 1.3 Gb e arriva tutto fino all'ultima goccia, ma in localhost. Appena posso lo provo nella rete e poi vorrei implementarlo con le regole dell'FTP.
L'errore era questo: quando informavo la socket di destinazione sulla lunghezza del file, leggevo un byte in meno, il quale penso restasse nel buffer della socket e mi sballava di un solo byte la lettura del maledetto file.
Senza di voi non ce l'avrei fatta
Codice: Seleziona tutto
/* scrive il file al path f, nella scoket sockfd */
int f_transfert_sock(char *f, int sockfd)
{
FILE *fs;
int szf, rszf, wr;
char len[125];
int buffer[SIZE_BUF];
struct stat b;
fs = fopen(f,"rb");
if(fs==NULL) return 0;
if(stat(f,&b)==-1) return 0;
szf=b.st_size;
snprintf(len,125,"%d",szf);
wr = write(sockfd,len,125);
if(wr<0) error("write");
while(szf)
{
if(szf<SIZE_BUF)
{
szf = fread(buffer,1,szf,fs);
wr = write(sockfd,buffer,szf);
if(wr!=szf) return 0;
szf = 0;
}
else
{
rszf = fread(buffer,1,SIZE_BUF,fs);
wr = write(sockfd,buffer,rszf);
if(wr!=rszf) return 0;
szf-=rszf;
}
}
fclose(fs);
return 0;
}
Codice: Seleziona tutto
/* legge dalla socket sockfd un file di grandezza sz e lo copia nel path del nuovo file f */
int f_recv_sock(char *f, int sockfd, long sz)
{
FILE *fd;
int szf, rszf, wr , w, ret, i;
int buffer[SIZE_BUF];
fd = fopen(f,"wb");
if(fd==NULL) return -1;
while(sz)
{
if(sz<SIZE_BUF)
{
w = read(sockfd, buffer, sz);
ret = fwrite(buffer,1,w,fd);
if(ret!=w) error("copia inconsistente");
sz=0;
}
else{
wr = read(sockfd, buffer, SIZE_BUF);
ret = fwrite(buffer, 1, wr, fd);
if(ret!=wr) error("copia inconsistente");
sz-=ret;
}
}
fclose(fd);
printf("FILE RICEVUTO\n");
return 0;
}
Re: [C] problema fscanf
Inviato: domenica 14 giugno 2015, 19:19
da vbextreme
la modalità testuale e binaria è una prerogativa Microsoft, ovvero il s.o. aiuta nella gestione dei due file.
In linux ciò non avviene come è logico che sia, se uso le funzioni "testuali" quale ad esempio fgets è logico che stia trattando il file in maniera testuale mentre se uso fread è logico che lo stia trattando in maniera binaria.
A rigor di logica ha ragione linux, anche un file di testo è un file binario, dopotutto i caratteri "non esistono" nei computer.
Per tanto se voglio leggere n byte delimitati da \0 e \n userò fgets, se voglio leggere un carattere indistintamente da ciò che contiene userò fread.
La ino_cpy() copia sia i file di testo che i file mp3 che qualsiasi altro formato e apre il file in modalità "non binaria".
La forma usata però non è portabile e dunque è stata inserita in GCC la possibilità di aprire il file in maniera binaria tramite il suffisso "b" , esso sarà valutato in base al sistema operativo e nel nostro caso sarà semplicemente scartato.
Come dicevo era un semplicissimo errore logico di un'antipatica funzione...
Re: [C] problema fscanf
Inviato: domenica 14 giugno 2015, 19:30
da errullaiolo
Capito!
Due socket implementate con due linguaggi differenti, possono comunque comunicare tra loro senza problemi conoscendo il numero di porta e l'IP?
Re: [C] problema fscanf
Inviato: domenica 14 giugno 2015, 19:45
da vbextreme
si e no, la comunicazione è un'operazione abbastanza complessa.
Bisogna implementare un protocollo che garantisca la giusta sincronizzazione e utilizzare il corretto marshalling dei dati.
Diciamo che i mainstream usati non hanno bisogno di tante "coccole" e applicazioni sperimentali spesso funzioneranno anche senza un solido protocollo e senza neppure sapere cosa sia il marshalling dei dati.
Il linguaggio usato è irrilevante.
Re: [C] problema fscanf
Inviato: domenica 14 giugno 2015, 19:48
da gila75
La ino_cpy() copia sia i file di testo che i file mp3 che qualsiasi altro formato e apre il file in modalità "non binaria".
La forma usata però non è portabile e dunque è stata inserita in GCC la possibilità di aprire il file in maniera binaria tramite il suffisso "b" , esso sarà valutato in base al sistema operativo e nel nostro caso sarà semplicemente scartato.
Capito. Proverò la ino_cpy()
Ora non disturbo più...ho già sollevato troppi disturbi all'utente...e in passato ho preso qualche tiraata d'orecchie dai moderatori.
Quindi a voi la parola
Grazie Vb
Re: [C] problema fscanf
Inviato: domenica 14 giugno 2015, 20:04
da errullaiolo
Per risolvere i problemi riguardanti la diversa rappresentazione dei dati (Big-Endian o Little-Endian e chi spaccherà meglio queste uova !!! (Gulliver)), i vari linguaggi mettono a disposizioni le primitive per far viaggiare i dati in Network Byte Order o Big-Endian e una volta arrivati all'host, la primitiva inversa che li converte dal formato network a host.
Sto studiando le socket dato che ho intenzione di comprare un arduino yun con linux, e vorrei fare di lui un'entità comunicante tramite le socket.
Oggi con l'internet of things è un settore che mi affascina molto.
Gila non disturbi affatto

Re: [C] problema fscanf
Inviato: domenica 14 giugno 2015, 21:12
da vbextreme
@gila non devi usare la ino, la devi imparare! e poi chiedere è lecito, risondere è cortesia...
©errullaiolo non esiste solo il big edian e il litte,esistono molte altre configurazioni....si cmq ci sono varie funzioni dei socket che risolvono il problema.
Bella la yun ma perche non valuti una odroid c1? Costa meno ed è piu performante, se poi la vuoi trasformare in una yun ti compri una leonardo e la colleghi in usb...
Impari di piu! ed hai un mostro tra le mani!
Re: [C] problema fscanf
Inviato: domenica 14 giugno 2015, 21:19
da gila75
@gila non devi usare la ino, la devi imparare! e poi chiedere è lecito, risondere è cortesia...
Ho realizzato solo ora il discorso del binario in linux e fgets() per i testi e fread() per i binari.
è vero in effetti facevo così anche io. Ho detto una caz...ta.
Lo avevo capito e lo facevo, poi passano un paio di mesi e già rimuovo.

Re: [C] problema fscanf
Inviato: lunedì 15 giugno 2015, 0:17
da errullaiolo
Wow non sapevo nemmeno dell'esistenza. Spettacolare!!! Ho paura che ben presto sarà il mio giocattolo preferito.