Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [vb.net] Ancora System.Net.Sockets
Forum - C# / VB.NET - [vb.net] Ancora System.Net.Sockets

Avatar
Alfonso (Normal User)
Rookie


Messaggi: 37
Iscritto: 16/05/2009

Segnala al moderatore
Postato alle 14:32
Martedì, 02/06/2009
Dopo aver scritto un SERVER e un CLIENT che si collegano e si scambiano informazioni senza problemi sono incappato in una anomalia che si manifesta in entrambe le direzioni:

se trasmetto la stringa "FINE" o qualsiasi altra stringa

     Dim Bytes() As Byte = System.Text.ASCIIEncoding.ASCII.GetBytes("FINE")

     netstream.Write(Bytes, 0, Bytes.Length)


il corrispondente riceve
    
     Dim Bytes(256) As Byte  ' o anche Dim Bytes(tcpClient.ReceiveBufferSize) As Byte

     netstream.Read(Bytes, 0, Bytes.Length)

     Dim strData As String = System.Text.ASCIIEncoding.ASCII.GetString(Bytes)


A questo punto se

     text1.text=strData   'nella casella di testo appare FINE  


ma se voglio controllare il contenuto della stringa
    
     If strData="FINE" then

' quì non arriva mai perchè strData per il programma è strData è uguale a:   "Fine

     end if


se nella finestra controllo immediato stampo

? strData
"FINE

? len(strData)
257

? trim(strData)
"FINE"

ma se modifico il codice in

      If trim(strData)="FINE" then

      ' quì non arriva comunque è sempre uguale a:   "Fine

      end if


Perchè?  Grazie1000

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 15:01
Martedì, 02/06/2009
E' molto probabile che ci siano dei caratteri (come cr lf) alla fine.

Prova a fare la if controllando solamente la substring fatta dai primi 4 caratteri


- Se le mie risposte non vi soddisfano, ignoratele, altrimenti un "grazie" e' molto gradito ...

"Dai un pesce (programma) a un uomo e lo nutrirai per un giorno. Insegnagli a pescare (programmare) e lo nutrirai per tutta la vita." (niente pappa pronta)
PM Quote
Avatar
ruggy94 (Member)
Guru


Messaggi: 890
Iscritto: 21/04/2008

Segnala al moderatore
Postato alle 15:04
Martedì, 02/06/2009
E poi sarebbe meglio utilizzare il tag Code
Codice sorgente - presumibilmente Plain Text

  1.  


quando si scrive del codice, in modo da renderlo più ordinato e leggibile, specialmente se il codice è lungo. :k:


"Se vuoi che una funzione di un programma non venga mai trovata, descrivila nella documentazione"
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 17:13
Mercoledì, 03/06/2009
Non si tratta di cr o lf, ma di un Null. Non riusciresti comunque ad ottenere la stringa come vuoi con tutti i metodi della classe string (Remove, Replace, Trim, ecc...). L'unica soluzione è leggere la risposta un byte alla volta e fermarsi quando si arriva al byte che vale 0. In alternativa puoi usare la funzione StartsWidth, dato che comunque la stringa inizia con "FINE", anche se non termina:
Codice sorgente - presumibilmente C# / VB.NET

  1. If str.StartsWith("FINE") Then ...



"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 17:30
Mercoledì, 03/06/2009
Testo quotato

Postato originariamente da Il Totem:

Non si tratta di cr o lf



Infatti, avevo detto "come" cr lf (comunque non visibili...) e, come detto, la Substr risolveva il problema

Substring(0, 4)

Codice sorgente - presumibilmente C# / VB.NET

  1. If str.Substring(0, 4) = "FINE" Then ...





- Se le mie risposte non vi soddisfano, ignoratele, altrimenti un "grazie" e' molto gradito ...

"Dai un pesce (programma) a un uomo e lo nutrirai per un giorno. Insegnagli a pescare (programmare) e lo nutrirai per tutta la vita." (niente pappa pronta)
PM Quote
Avatar
Alfonso (Normal User)
Rookie


Messaggi: 37
Iscritto: 16/05/2009

Segnala al moderatore
Postato alle 9:06
Giovedì, 04/06/2009
Io sono qui per imparare a pescare.

Dunque se in vb6 la stringa di ritorno ha semplicemente un chr(0) alla fine, in vb9 è una stringa lunga quanto il buffer di ricezione riempita di null.

Per cui se imposto

   Dim Bytes(tcpClient.ReceiveBufferSize) As Byte

avrò una stringa di 8193 bytes anche se la risposta è soltanto "FINE".


A questo punto serve impostare

   Dim Bytes(256) As Byte

se so già che la risposta sarà di lunghezza corta??
E se la risposta dovesse essere molto lunga è ininfluente per la velocità dello scambio dati impostare Byte(256) piuttosto che Byte(8192)?

Grazie1000

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 19:28
Venerdì, 05/06/2009
Io e theprogrammer ti abbia fornito due soluzioni per il tuo problema. Quello che chiedi, però, è un'altra cosa. La dimensione del buffer non è influente - fino a un certo punto - sulle prestazioni: con buffer più grandi scriverai meno spesso, ma avrai più carico da ricevere; con buffer più piccoli avrai un alta frequenza di refresh, ma meno carico di dati. Ad ogni modo, ti consiglio di tenere la dimensione sui 256/512 se devi inviare solo stringhe (comandi ad esempio), oppure sui 8128 o multipli se devi ricevere files interi.
Poi, la dimensione non preclude l'accesso ai dati: anche con un buffer di 8kb, il client ne può scrivere 9, mentre il server ne leggerà prima 8 e poi 1 con 7kb di padding.


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote