|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
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); |
![]() |
![]() |
![]() |
#2 |
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).
|
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
|
![]() |
![]() |
![]() |
#4 |
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)); } Non credo che si debba creare preventivamente, allocandolo, un buffer gigantesco per poi inviarlo vero? |
![]() |
![]() |
![]() |
#5 |
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?
|
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
Quote:
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. |
|
![]() |
![]() |
![]() |
#7 | |
Member
Iscritto dal: May 2009
Messaggi: 186
|
Quote:
Inoltre, quell'if all'interno del ciclo penso sia inutile. |
|
![]() |
![]() |
![]() |
#8 | |
Member
Iscritto dal: May 2009
Messaggi: 186
|
Quote:
|
|
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
Quote:
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); Spero si capisca la mia affermazione. |
|
![]() |
![]() |
![]() |
#10 | |
Member
Iscritto dal: May 2009
Messaggi: 186
|
Quote:
|
|
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
Quote:
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? |
|
![]() |
![]() |
![]() |
#12 | |
Member
Iscritto dal: May 2009
Messaggi: 186
|
Quote:
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. |
|
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
Quote:
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? |
|
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
|
![]() |
![]() |
![]() |
#15 | |
Member
Iscritto dal: May 2009
Messaggi: 186
|
Quote:
In genere, non si controlla come vengono spediti i byte. Sarebbe una complicazione in più senza alcun vantaggio. |
|
![]() |
![]() |
![]() |
#16 |
Member
Iscritto dal: May 2009
Messaggi: 186
|
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.
|
![]() |
![]() |
![]() |
#17 | |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
Quote:
Io sto usando una intesazione del tipo <INIZIOFILE>, ............ , <FINEFILE> è concettualmente sbagliato? |
|
![]() |
![]() |
![]() |
#18 |
Member
Iscritto dal: May 2009
Messaggi: 186
|
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.
|
![]() |
![]() |
![]() |
#19 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
scusa ma non potrebbe accadere che il byte da te scelto viene confuso con un byte del testo che vuoi ricevere/inviare?
|
![]() |
![]() |
![]() |
#20 | ||
Member
Iscritto dal: May 2009
Messaggi: 186
|
Quote:
Quote:
|
||
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 06:49.