Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Samsung Galaxy Z Fold7: un grande salto generazionale
Recensione Samsung Galaxy Z Fold7: un grande salto generazionale
Abbiamo provato per molti giorni il nuovo Z Fold7 di Samsung, un prodotto davvero interessante e costruito nei minimi dettagli. Rispetto al predecessore, cambiano parecchie cose, facendo un salto generazionale importante. Sarà lui il pieghevole di riferimento? Ecco la nostra recensione completa.
The Edge of Fate è Destiny 2.5. E questo è un problema
The Edge of Fate è Destiny 2.5. E questo è un problema
Bungie riesce a costruire una delle campagne più coinvolgenti della serie e introduce cambiamenti profondi al sistema di gioco, tra nuove stat e tier dell’equipaggiamento. Ma con risorse limitate e scelte discutibili, il vero salto evolutivo resta solo un’occasione mancata
Ryzen Threadripper 9980X e 9970X alla prova: AMD Zen 5 al massimo livello
Ryzen Threadripper 9980X e 9970X alla prova: AMD Zen 5 al massimo livello
AMD ha aggiornato l'offerta di CPU HEDT con i Ryzen Threadripper 9000 basati su architettura Zen 5. In questo articolo vediamo come si comportano i modelli con 64 e 32 core 9980X e 9970X. Venduti allo stesso prezzo dei predecessori e compatibili con il medesimo socket, le nuove proposte si candidano a essere ottimi compagni per chi è in cerca di potenza dei calcolo e tante linee PCI Express per workstation grafiche e destinate all'AI.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 20-06-2012, 20:05   #1
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
[C++] Socket con Borland Builder C++

ciao,
ho preso in prestito questa porzione di codice in stile Borland Builder C++ il quale una volta inserito nell'evento approriato, prende tutto, nel mio caso mi interessa testo in formato ASCII, che viene inviato da un client e lo visualizza nel componente Memo dell'aplicativo server.

Problema: inviando n volte il medesimo file, a volte viene troncato in coda ed a volte manca la testa del file; altre ancora vengono prelevati solo 2 o più caratteri. Avete conoscenza di questo funzionamento randomico della VCL?

p.s.
anche terminando Buffer a NULL il risultato è il medesimo.

note: la mia convinzione è che il protocollo TCP/IP dovrebbe garantirmi la ritrasmissione nel caso di perdita di pacchetti.

grazie

Codice:
 int Size=ClientSocket1->Socket->ReceiveLength();
 char *Buffer = new char[Size];
 ClientSocket1->Socket->ReceiveBuf(Buffer,Size);
 Memo1->Lines->Add(Buffer);
http://forum.html.it/forum/showthrea...hreadid=610596
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 21-06-2012, 05:56   #2
karch_kiraly
Member
 
Iscritto dal: Nov 2005
Messaggi: 96
Non conosco il Borland builder c++. Per certo utilizzando il protocollo TCP hai la garanzia di ricezione dei dati trasmessi (a differenza dell'UDP).
karch_kiraly è offline   Rispondi citando il messaggio o parte di esso
Old 21-06-2012, 07:06   #3
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
Quote:
Originariamente inviato da karch_kiraly Guarda i messaggi
Non conosco il Borland builder c++. Per certo utilizzando il protocollo TCP hai la garanzia di ricezione dei dati trasmessi (a differenza dell'UDP).
grazie per la conferma, difatti era quello che mi ricordavo
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 21-06-2012, 07:48   #4
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
scusate ma mi viene un dubbio se sia legale o meno inviare dati ad un server in questo modo:

Codice:
while ( fgets(linea,sizeof(linea),fp) != NULL)
                {
                if( ClientSocket1->Active )
                        ClientSocket1->Socket->SendBuf(linea,strlen(linea));
                }
cioè una linea alla volta presa da disco.
Non credo che si debba creare preventivamente, allocandolo, un buffer gigantesco per poi inviarlo vero?
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 21-06-2012, 13:21   #5
lorenzo001
Senior Member
 
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
Puoi inviare i dati come vuoi. Però, dalla parte di chi riceve, come si fa a determinare quanti caratteri ricevuti fanno parte della stringa?
lorenzo001 è offline   Rispondi citando il messaggio o parte di esso
Old 21-06-2012, 18:18   #6
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
Quote:
Originariamente inviato da lorenzo001 Guarda i messaggi
Puoi inviare i dati come vuoi. Però, dalla parte di chi riceve, come si fa a determinare quanti caratteri ricevuti fanno parte della stringa?
se ho capito la tua domanda, ci pensa la chiamata:
int size=ServerSocket1->Socket->ReceiveLength();

unico dubbio è che non so se la dimensione ritornata si riferisce ad un pacchetto (porzione del file inviato dal client) oppure alla dimensione totale del file che verrà inviato da un client.

Facendo delle prove per uno stesso file ho notato che ogni volta size è differente; a volte ha la dimensione dell'intero file, a volte solo pochi caratteri.

Se la size si riferisce al payload di un solo pacchetto allora avrei scoperto dove sta l'erore, in caso contrario allora c'è un problema nelle socket ma ho qualche dubbio.
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 21-06-2012, 19:23   #7
ESSE-EFFE
Member
 
Iscritto dal: May 2009
Messaggi: 186
Quote:
Originariamente inviato da misterx Guarda i messaggi
scusate ma mi viene un dubbio se sia legale o meno inviare dati ad un server in questo modo:

Codice:
while ( fgets(linea,sizeof(linea),fp) != NULL)
                {
                if( ClientSocket1->Active )
                        ClientSocket1->Socket->SendBuf(linea,strlen(linea));
                }
cioè una linea alla volta presa da disco.
Non credo che si debba creare preventivamente, allocandolo, un buffer gigantesco per poi inviarlo vero?
Ammesso che non ci siano inghippi a leggere il file in quel modo, vedo due problemi: il primo è che la SendBuf potrebbe sollevare un'eccezione (che dal codice non sembra gestita). Il secondo è che bisognerebbe verificare il valore di ritorno della SendBuf, per controllare che il buffer sia stato effettivamente trasmesso (accodato) altrimenti va gestito opportunamente l'errore.

Inoltre, quell'if all'interno del ciclo penso sia inutile.
__________________
ESSE-EFFE.com
Sviluppo software e Web
Creazione loghi - Bergamo
ESSE-EFFE è offline   Rispondi citando il messaggio o parte di esso
Old 21-06-2012, 19:31   #8
ESSE-EFFE
Member
 
Iscritto dal: May 2009
Messaggi: 186
Quote:
Originariamente inviato da misterx Guarda i messaggi
se ho capito la tua domanda, ci pensa la chiamata:
int size=ServerSocket1->Socket->ReceiveLength();

unico dubbio è che non so se la dimensione ritornata si riferisce ad un pacchetto (porzione del file inviato dal client) oppure alla dimensione totale del file che verrà inviato da un client.

Facendo delle prove per uno stesso file ho notato che ogni volta size è differente; a volte ha la dimensione dell'intero file, a volte solo pochi caratteri.

Se la size si riferisce al payload di un solo pacchetto allora avrei scoperto dove sta l'erore, in caso contrario allora c'è un problema nelle socket ma ho qualche dubbio.
Non c'è nessun problema nei socket. Quella dimensione ovviamente è pari alla quantità dei byte a disposizione (da leggere). Non è detto (ed è improbabile) che coincida con quella del pacchetto inviato lato client. Ancora più improbabile che coincida con la dimensione del file (salvo casi particolari).
__________________
ESSE-EFFE.com
Sviluppo software e Web
Creazione loghi - Bergamo
ESSE-EFFE è offline   Rispondi citando il messaggio o parte di esso
Old 21-06-2012, 20:19   #9
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
Quote:
Originariamente inviato da ESSE-EFFE Guarda i messaggi
Non c'è nessun problema nei socket. Quella dimensione ovviamente è pari alla quantità dei byte a disposizione (da leggere). Non è detto (ed è improbabile) che coincida con quella del pacchetto inviato lato client. Ancora più improbabile che coincida con la dimensione del file (salvo casi particolari).
vuoi dire che per ricevere il file completo mi servono n chiamate a quella funzione?

Se è così allora il mio problema è di concetto e del tipo:
Codice:
FILE *fp;
fp=fopen("prova.txt","w");
int size=ServerSocket1->Socket->ReceiveLength();
char *Buffer = new char[Size];
ServerSocket1->Socket->ReceiveBuf(Buffer,Size);
fprintf(fp,"%s",Buffer);
fclose(fp);
tralasciando le inesattezze del codice, sto pretendendo in quel modo di salvare tutto il file inviato dal client con un'unica chiamata a ReceiveBuf()?

Spero si capisca la mia affermazione.
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 22-06-2012, 07:45   #10
ESSE-EFFE
Member
 
Iscritto dal: May 2009
Messaggi: 186
Quote:
Originariamente inviato da misterx Guarda i messaggi
vuoi dire che per ricevere il file completo mi servono n chiamate a quella funzione?

Se è così allora il mio problema è di concetto e del tipo:
Codice:
FILE *fp;
fp=fopen("prova.txt","w");
int size=ServerSocket1->Socket->ReceiveLength();
char *Buffer = new char[Size];
ServerSocket1->Socket->ReceiveBuf(Buffer,Size);
fprintf(fp,"%s",Buffer);
fclose(fp);
tralasciando le inesattezze del codice, sto pretendendo in quel modo di salvare tutto il file inviato dal client con un'unica chiamata a ReceiveBuf()?

Spero si capisca la mia affermazione.
Esatto, per ricevere tutto il file è verosimile che ti servano diverse chiamate alla ReceiveBuf (o ReceiveText). Non puoi farlo con una chiamata unica perchè non funzionerà praticamente mai. Il TCP è un protocollo di trasporto, ma poi è necessario stabilire un protocollo a livello applicativo per far dialogare le parti (client e server).
__________________
ESSE-EFFE.com
Sviluppo software e Web
Creazione loghi - Bergamo
ESSE-EFFE è offline   Rispondi citando il messaggio o parte di esso
Old 24-06-2012, 19:09   #11
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
Quote:
Originariamente inviato da ESSE-EFFE Guarda i messaggi
Esatto, per ricevere tutto il file è verosimile che ti servano diverse chiamate alla ReceiveBuf (o ReceiveText). Non puoi farlo con una chiamata unica perchè non funzionerà praticamente mai. Il TCP è un protocollo di trasporto, ma poi è necessario stabilire un protocollo a livello applicativo per far dialogare le parti (client e server).
ecco perchè facendo n invii il server a volte, il server, riceveva il file completo ed a volte no. Difatto studiano la dimensione del buffer ricevuto dal server questo cambiava randomicamente ogni vota.
Quindi una sorta di carattere o simbolo inviato dal client allo scopo di informare il server della testa e coda del file dovrebbe funzionare vero?

Lato server continui a leggere sino a quando ricevi il carattere speciale di fine file.

Non so se solitamente si segue questa strada, magari c'è un modo più furbo?
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 25-06-2012, 13:38   #12
ESSE-EFFE
Member
 
Iscritto dal: May 2009
Messaggi: 186
Quote:
Originariamente inviato da misterx Guarda i messaggi
Quindi una sorta di carattere o simbolo inviato dal client allo scopo di informare il server della testa e coda del file dovrebbe funzionare vero?

Lato server continui a leggere sino a quando ricevi il carattere speciale di fine file.

Non so se solitamente si segue questa strada, magari c'è un modo più furbo?
E' una soluzione semplice che può funzionare. Basta che i sincronismi non siano presenti nel file ovviamente.

Altra soluzione comune è quella di inviare un header in cui sia presente la dimensione del file (o comunque dei dati) da inviare. Così facendo si potrebbero trasferire anche altre informazioni, come ad esempio il nome del file.

Oppure si utilizzano protocolli standard più complessi come HTTP o FTP.
__________________
ESSE-EFFE.com
Sviluppo software e Web
Creazione loghi - Bergamo
ESSE-EFFE è offline   Rispondi citando il messaggio o parte di esso
Old 25-06-2012, 13:59   #13
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
Quote:
Originariamente inviato da ESSE-EFFE Guarda i messaggi
E' una soluzione semplice che può funzionare. Basta che i sincronismi non siano presenti nel file ovviamente.

Altra soluzione comune è quella di inviare un header in cui sia presente la dimensione del file (o comunque dei dati) da inviare. Così facendo si potrebbero trasferire anche altre informazioni, come ad esempio il nome del file.

Oppure si utilizzano protocolli standard più complessi come HTTP o FTP.
nel frattempo sto provando ad usare un sistema con due buffer: uno che viene definito ogni volta ed uno dinamico, questo per usare il metodo dell'informazione in testa ed in coda al file.

Un dubbio che ho è come mai se invio prima l'informazione che stabilisce l'inizio del file e poi il corpo ed infine la coda, a volte nella medesima chiamata a ServerSocket1->Socket->ReceiveBuf(Buffer,Size); trovo l'informazione di testa ed il corpo inzieme.

Per farmi capire, si comporta come il buffer di una stampante dove s e non vi sono sufficienti caratteri questa non stampa.

Quello che vorrei ottenere è l'invio della testa del file, del corpo ed infine della coda ed almeno che testa e coda vengano inviati non assieme al corpo: è possibile?
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 25-06-2012, 14:18   #14
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
Quote:
Originariamente inviato da ESSE-EFFE Guarda i messaggi
Basta che i sincronismi non siano presenti nel file ovviamente.
dimenticavo: cosa intendi con quella frase?
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 25-06-2012, 14:23   #15
ESSE-EFFE
Member
 
Iscritto dal: May 2009
Messaggi: 186
Quote:
Originariamente inviato da misterx Guarda i messaggi
Un dubbio che ho è come mai se invio prima l'informazione che stabilisce l'inizio del file e poi il corpo ed infine la coda, a volte nella medesima chiamata a ServerSocket1->Socket->ReceiveBuf(Buffer,Size); trovo l'informazione di testa ed il corpo inzieme.
Evidentemente a livello TCP le due informazioni sono state inviate in un unico pacchetto. Considerando che probabilmente quella che tu chiami "informazione di testa" sarà un byte solo, la cosa è abbastanza logica.

In genere, non si controlla come vengono spediti i byte. Sarebbe una complicazione in più senza alcun vantaggio.
__________________
ESSE-EFFE.com
Sviluppo software e Web
Creazione loghi - Bergamo
ESSE-EFFE è offline   Rispondi citando il messaggio o parte di esso
Old 25-06-2012, 14:30   #16
ESSE-EFFE
Member
 
Iscritto dal: May 2009
Messaggi: 186
Quote:
Originariamente inviato da misterx Guarda i messaggi
dimenticavo: cosa intendi con quella frase?
Intendo che i byte utilizzati come sincronismo non devono essere presenti nei dati, altrimenti chi riceve non riuscirebbe a riconoscerli. Quindi, per file di testo problemi non ce ne sono, ma per inviare qualunque tipo di file, utilizza un header.
__________________
ESSE-EFFE.com
Sviluppo software e Web
Creazione loghi - Bergamo
ESSE-EFFE è offline   Rispondi citando il messaggio o parte di esso
Old 25-06-2012, 14:39   #17
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
Quote:
Originariamente inviato da ESSE-EFFE Guarda i messaggi
Considerando che probabilmente quella che tu chiami "informazione di testa" sarà un byte solo, la cosa è abbastanza logica.
perchè parli di un byte?
Io sto usando una intesazione del tipo <INIZIOFILE>, ............ , <FINEFILE> è concettualmente sbagliato?
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 25-06-2012, 14:47   #18
ESSE-EFFE
Member
 
Iscritto dal: May 2009
Messaggi: 186
Quote:
Originariamente inviato da misterx Guarda i messaggi
perchè parli di un byte?
Io sto usando una intesazione del tipo <INIZIOFILE>, ............ , <FINEFILE>
Perchè sarebbe sufficiente un byte. Ma per il discorso del pacchetto TCP è la stessa cosa. Idem per l'eventuale presenza delle intestazioni all'interno del file.
__________________
ESSE-EFFE.com
Sviluppo software e Web
Creazione loghi - Bergamo
ESSE-EFFE è offline   Rispondi citando il messaggio o parte di esso
Old 25-06-2012, 14:59   #19
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
Quote:
Originariamente inviato da ESSE-EFFE Guarda i messaggi
Perchè sarebbe sufficiente un byte. Ma per il discorso del pacchetto TCP è la stessa cosa. Idem per l'eventuale presenza delle intestazioni all'interno del file.
scusa ma non potrebbe accadere che il byte da te scelto viene confuso con un byte del testo che vuoi ricevere/inviare?
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 25-06-2012, 16:06   #20
ESSE-EFFE
Member
 
Iscritto dal: May 2009
Messaggi: 186
Quote:
Originariamente inviato da misterx Guarda i messaggi
scusa ma non potrebbe accadere che il byte da te scelto viene confuso con un byte del testo che vuoi ricevere/inviare?
Vedi messaggi precedenti:

Quote:
Originariamente inviato da ESSE-EFFE Guarda i messaggi
Basta che i sincronismi non siano presenti nel file ovviamente.
Quote:
Originariamente inviato da ESSE-EFFE Guarda i messaggi
Intendo che i byte utilizzati come sincronismo non devono essere presenti nei dati, altrimenti chi riceve non riuscirebbe a riconoscerli. Quindi, per file di testo problemi non ce ne sono, ma per inviare qualunque tipo di file, utilizza un header.
__________________
ESSE-EFFE.com
Sviluppo software e Web
Creazione loghi - Bergamo
ESSE-EFFE è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione Samsung Galaxy Z Fold7: un grande salto generazionale Recensione Samsung Galaxy Z Fold7: un grande sal...
The Edge of Fate è Destiny 2.5. E questo è un problema The Edge of Fate è Destiny 2.5. E questo ...
Ryzen Threadripper 9980X e 9970X alla prova: AMD Zen 5 al massimo livello Ryzen Threadripper 9980X e 9970X alla prova: AMD...
Acer TravelMate P4 14: tanta sostanza per l'utente aziendale Acer TravelMate P4 14: tanta sostanza per l'uten...
Hisense M2 Pro: dove lo metti, sta. Mini proiettore laser 4K per il cinema ovunque Hisense M2 Pro: dove lo metti, sta. Mini proiett...
'Il realismo ha rovinato i videogiochi' ...
Crollano anche i TV QLED Hisense: c'&egr...
Photoshop 2025: le nuove funzioni AI che...
Qualcomm cresce, ma la CPU per datacente...
Gli iPhone in offerta oggi? C'è i...
L'evoluzione di Revolut: arrivano anche ...
Microsoft entra nel club dei 4.000 milia...
Ufficiale, Google firmerà il Codi...
Mettereste una NPU dedicata all'intellig...
I nuovi iPhone 17 costeranno di pi&ugrav...
Zuckerberg: 'Chi non indosserà sm...
La scopa elettrica bestseller super acce...
Amazon, svendite pesanti di 11 TV OLED: ...
Xbox: dal prossimo mese verifica dell'id...
Corsair AI Workstation 300: poco pi&ugra...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 09:27.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v