Split di una stringa inviata via socket, ultimo elemento del risultato...

martedì 18 gennaio 2011 - 18.25
Tag Elenco Tags  VB.NET  |  .NET 2.0  |  Windows Server 2008  |  Visual Studio 2005

gestoff Profilo | Newbie

Salve a tutti è la prima volta che scrivo qui, ma in generale che scrivo in un forum specifico di programmazione. Questo perchè cerco e quasi sempre trovo la soluzione ai problemi sui vari forum italiani e inglesi.
Ma questa volta non so proprio come uscirne.

Sviluppo da anni in Vb6 ma pochi mesi fa ho provato a rifare un programma in Vb.Net 2005. Sviluppo su una macchina server 2008.

Il problema da cui non riesco ad uscire è questo:
Invio in broadcast tramite un socket con protocollo UDP una stringa tipo: "nome del computer che invia il messaggio| corpo del messaggio|grado di importanza del messaggio"
per esempio PCSERVER|CIAO|i
la "i" finale sta per "importante" e quando faccio lo split del messaggio ricevuto sul client il terzo elemento splittato contiene, guardando la finestra immediata "Locale" di visual studio, "i . Im pratica la i non è racchiusa fra le virgolette doppie come gli altri due valori.

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

In pratica il Case "I" non viene mai valutato perche il confronto viene fatto con il valore "I senza l'ultima virgoletta doppia.

Aggiungo info su quello che credo sia il problema: il client che invia la stringa usa un buffer della stessa lunghezza del messaggio, mentre l'host che riceve il messaggio usa un buffer fisso di 1024 byte.


Ho provato anche a fare lo split semplicemente mettendo il carattere di separazione direttamnete nella funzione split : msg.split("|"c) ma non cambia niente.
Qualcuno ha avuto esperienze di questo tipo?
Grazie per eventuali risposte e un saluto a tutti.

AntCiar Profilo | Expert

Ciao.

Non penso che il problema sia nella 'i' che manca del 'doppio apice'.

io ho provato con questo codice e funziona bene:

Dim msg As String = "PCSERVER|CIAO|i" Dim valutazione As String() Dim separatore As String = "|" valutazione = msg.Split(separatore.ToCharArray(), StringSplitOptions.RemoveEmptyEntries) If valutazione.Length = 3 Then Select Case valutazione(2).ToUpper() Case "I" MsgBox(valutazione(0)) End Select End If

Secondo me nella variabile 'msg', quando ti arriva il messaggio ci va a finire qualche carattere particolare. prova a vedere con questo pezzo di codice:

MsgBox(Char.ConvertToUtf32(msg.Chars(msg.Length - 1), 0))

se l'ultimo carattere è la 'i' (minuscola) dovrebbe darti 105 come risultato.
ciao
Cristian Barca

gestoff Profilo | Newbie

Ciao e grazie per la risposta efficace. In effetti usando il tuo codice
MsgBox(Char.ConvertToUtf32(msg.Chars(msg.Length - 1), 0))

La risposta è uno zero e mi sono accorto che la lunghezza della variabile msg è sempre 1025 anche se uso il trim . Evidendemente alla variabile msg viene passato tutto il buffer di lettura che è di 1024 byte + 1 byte di non so che cosa, ma pare che i "caratteri" vuoti non siano "spazi" vuoti , altrimenti il trim li toglierebbe e la lunghezza della variabile msg sarebbe stata ridotta.

Non so se c'è una funzione oltre al trim che toglie i caratteri in eccesso, ma di quali caratteri stiamo parlando se non sono spazi vuoti?

Quando invio il messaggio uso questo codice
Dim sender As New UdpClient() Dim groupEP As New IPEndPoint(GroupAddress, GroupPort) Dim bytes As [Byte]() = System.Text.Encoding.ASCII.GetBytes(message) sender.Send(bytes, bytes.Length, groupEP)
e per riceverlo uso questo:
mcastSocket = New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp) Dim localEP As EndPoint = CType(New IPEndPoint(localIPAddr, mcastPort), EndPoint) mcastSocket.Bind(localEP) bytes = New [Byte](1024) {} mcastSocket.ReceiveFrom(bytes, remoteEP) msg = Encoding.ASCII.GetString(bytes, 0, bytes.Length)

Il problema credo sia o nell' Encoding del messaggio in uscita o in quello di entrata del messaggio, ma non ho idee

PS: Se accetto il tuo post il thread viene chiuso?

AntCiar Profilo | Expert

ciao

>PS: Se accetto il tuo post il thread viene chiuso?

Il thread viene segnato come "risolto" e quindi altri utenti non lo apriranno pechè qualcuno ha già risolto il problema in oggetto.

Per quanto riguarda il resto, non ho mai usato UDP quindi non so effettivamente dove sbagli. Spero che qualcuno più ferrato in materia possa risolverti il problema.

ciao ciao
Cristian Barca

gestoff Profilo | Newbie

Grazie Cristian, anche perchè in certo senso mi hai indirizzato verso la soluzione.

Non sapevo che la funzione ReceiveFrom ritorna un Integer con la lunghezza effettiva dei bytes letti, indipendentemente dalla lunghezza del buffer utilizzato.
Quindi è bastato modificare il codice in questo modo:
Dim i As Int32 i = mcastSocket.ReceiveFrom(bytes, remoteEP) msg = Encoding.ASCII.GetString(bytes, 0, i)

per avere nella variabile msg i bytes effettivamente letti e quel punto funziona anche lo split
Grazie ancora
Ciao.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5