[C#] Switch kan niet correcte case kiezen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • AeroXbird
  • Registratie: Juni 2010
  • Laatst online: 24-07 21:02
Hallo,

Ik ben sinds een paar dagen bezig met een hobbyprojectje, een soort server-client communication projectje, om een beetje te trainen met sockets etc in het .net framework.
Ik kan nu successvol mijn string van mijn client naar server versturen, maar zodra ik de server een response laat sturen via een switch, gaat hij in plaats van de case, naar default, wat dus niet hoort.
Hier is de code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
requestCount = requestCount + 1;
                    NetworkStream networkStream = clientSocket.GetStream();
                    networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
                    dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
                    
                    
                    
                    Console.WriteLine(" [NET] " + "From client-" + clNo + dataFromClient);
             

                    switch (dataFromClient)
                    {
                        case "help":
                            Console.WriteLine("HELP TRIGGERED");
                            sendBytes = Encoding.ASCII.GetBytes("Welcome to the help menu!");
                            networkStream.Write(sendBytes, 0, sendBytes.Length);
                            sendBytes = null;
                            networkStream.Flush(); 
                            break;
                        default:
                            Console.WriteLine("DEFAULT MODE KICKED IN");
                            sendBytes = Encoding.ASCII.GetBytes("Default mode for command: " + dataFromClient);
                            networkStream.Write(sendBytes, 0, sendBytes.Length);
                            sendBytes = null;
                            networkStream.Flush(); 
                            break;
                    }
                    networkStream.Flush();

Acties:
  • 0 Henk 'm!

  • asfaloth_arwen
  • Registratie: Februari 2005
  • Laatst online: 17:57
Als je een debugpoint zet op regel 11 en de waarde van dataFromClient bekijkt, wat is die dan?

Specs


Acties:
  • 0 Henk 'm!

  • AeroXbird
  • Registratie: Juni 2010
  • Laatst online: 24-07 21:02
asfaloth_arwen schreef op zaterdag 15 oktober 2011 @ 21:26:
Als je een debugpoint zet op regel 11 en de waarde van dataFromClient bekijkt, wat is die dan?
Dan krijg ik netjes "help" terug (zonder quotes), wel met een boel spaties, wat voor mij nog een raadsel blijft.

[ Voor 3% gewijzigd door AeroXbird op 15-10-2011 21:29 ]


Acties:
  • 0 Henk 'm!

  • merijnen
  • Registratie: April 2001
  • Laatst online: 15-09 10:50

merijnen

Beam Me Up Scotty!

Dan zit daar je probleem in: de case moet exact overeenkomen. Je kan misschien even een trim doen op je returnwaarde, of zorgen dat deze netter terug wordt gegeven dan nu het geval is :)

Acties:
  • 0 Henk 'm!

  • ik222
  • Registratie: Maart 2007
  • Niet online
Die spaties zijn dan in elk geval de de reden dat het fout gaat aangezien "help " niet hetzelfde is als "help". Je kunt nu natuurlijk nasty iets van trim gaan doen waardoor de spaties weg zijn en de functie werkt. Maar beter is het natuurlijk om uit te vinden waarom die spaties erin komen.

[ Voor 43% gewijzigd door ik222 op 15-10-2011 21:37 ]


Acties:
  • 0 Henk 'm!

  • AeroXbird
  • Registratie: Juni 2010
  • Laatst online: 24-07 21:02
Helaas werkt het niet, ik trim de waarde van whitespaces voordat de switch geroepen word, maar het werkt helaas niet.
En met spaties bedoel ik het volgende:
Afbeeldingslocatie: http://i53.tinypic.com/b6yer5.png
Op het console scherm links zie je wel wat ik bedoel.

Acties:
  • 0 Henk 'm!

  • Mini-me
  • Registratie: November 1999
  • Niet online
AeroXbird schreef op zaterdag 15 oktober 2011 @ 21:40:
...
En met spaties bedoel ik het volgende:
[afbeelding]
Newline characters dus? \r\n ?

Acties:
  • 0 Henk 'm!

  • AeroXbird
  • Registratie: Juni 2010
  • Laatst online: 24-07 21:02
Mini-me schreef op zaterdag 15 oktober 2011 @ 21:43:
[...]

Newline characters dus? \r\n ?
Het lijkt daar op, al voeg ik deze zelf niet toe in de code, ze komen gewoon poef uit het niets het consolescherm op zodra ik wat probeer te outputten.
Het zou kunnen komen omdat ik de tekst van bytes naar ASCII omzet, maar dat zou geen problemen moeten opleveren.

Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

C#:
11
switch(dataFromClient.Trim()) 

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • AeroXbird
  • Registratie: Juni 2010
  • Laatst online: 24-07 21:02
Snake schreef op zaterdag 15 oktober 2011 @ 21:45:
C#:
11
switch(dataFromClient.Trim()) 
Helaas, hij schiet weer terug naar default, toch bedankt.

Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Ok, om te testen:
C#:
1
2
3
4
foreach(char c in dataFromClient)
{
   Console.WriteLine((int)c);
}

Zie je direct wat er eigelijk mee komt.

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • AeroXbird
  • Registratie: Juni 2010
  • Laatst online: 24-07 21:02
Snake schreef op zaterdag 15 oktober 2011 @ 21:48:
Ok, om te testen:
C#:
1
2
3
4
foreach(char c in dataFromClient)
{
   Console.WriteLine((int)c);
}

Zie je direct wat er eigelijk mee komt.
Hmm interessant, hij returned met een lijn zo lang dat het niet eens op het consolescherm past, hij begint met een boel nullen, dan komen er een paar niet-nul (de 4 letters dus) en dan weer een hele meuk nullen, ik neem aan dat die nullen spaties voorstellen.

Acties:
  • 0 Henk 'm!

  • huarru
  • Registratie: Januari 2007
  • Laatst online: 17-09 11:17
AeroXbird schreef op zaterdag 15 oktober 2011 @ 21:47:
[...]

Helaas, hij schiet weer terug naar default, toch bedankt.
Probeer eens dataFromClient.replace("\r\n","").trim(). Weet je zeker dat er geen newLines meekomen.

Acties:
  • 0 Henk 'm!

  • AeroXbird
  • Registratie: Juni 2010
  • Laatst online: 24-07 21:02
huarru schreef op zaterdag 15 oktober 2011 @ 21:52:
[...]


Probeer eens dataFromClient.replace("\r\n","").trim(). Weet je zeker dat er geen newLines meekomen.
Nope, werkt ook niet.
Zoals ik hiervoor al zei, hij voegt wel bij de karakters die spaties toe, wat raar is.

Acties:
  • 0 Henk 'm!

  • SKiLLa
  • Registratie: Februari 2002
  • Niet online

SKiLLa

Byte or nibble a bit ?

Ik gebruik meestal iets als ("###{0}###", debugString) zodat je NewLines of whitespaces/tabs meteen ziet ...
Verder zie ik dat je ook geen: using (NetworkStream networkStream) gebruikt, leer je die best-practise meteen aan zou ik zeggen ...

Maar on-topic, code:

code:
1
2
networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);


moet zijn:

code:
1
2
int bytesRead = networkStream.Read(bytesFrom, 0, bytesFrom.Length);
dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom, 0, bytesRead);


Nu converteer je altijd het hele buffer naar string, niet alleen het 'gevulde' gedeelte ...

'Political Correctness is fascism pretending to be good manners.' - George Carlin


Acties:
  • 0 Henk 'm!

  • AeroXbird
  • Registratie: Juni 2010
  • Laatst online: 24-07 21:02
SKiLLa schreef op zaterdag 15 oktober 2011 @ 21:58:
Ik gebruik meestal iets als ("###{0}###", debugString) zodat je NewLines of whitespaces/tabs meteen ziet ...
Verder zie ik dat je ook geen: using (NetworkStream networkStream) gebruikt, leer je die best-practise meteen aan zou ik zeggen ...

Maar on-topic, code:

code:
1
2
networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);


moet zijn:

code:
1
2
int bytesRead = networkStream.Read(bytesFrom, 0, bytesFrom.Length);
dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom, 0, bytesRead);


Nu converteer je altijd het hele buffer naar string, niet alleen het 'gevulde' gedeelte ...
O+ Hij werkt helemaal top!
Wat jij zei klopte, ik converteerde de hele meuk, inplaats van het stukje wat tekst was.
Heel erg bedankt :)
zou je ook even in kunnen gaan over dat using (NetworkStream networkStream) kunnen ingaan?
Ik snap niet helemaal hoe ik dat moet toepassen, en wat de voordelen daarvan zijn.

Acties:
  • 0 Henk 'm!

  • SKiLLa
  • Registratie: Februari 2002
  • Niet online

SKiLLa

Byte or nibble a bit ?

Dat gaat over IDisposable implementeren. Sommige objecten (zoals files/streams/db-connecties/etc.) vereisen dat je na gebruik expliciet het object 'opruimt'. Using is 'syntax sugar'; de compiler vertaalt het eigenlijk naar:

code:
1
2
3
4
5
6
7
8
9
10
DisposableObject disposableObject;
try
{
    disposableObject = ...
    // blaat blaat code
}
finally
{
    if (disposableObject) disposableObect.Dispose();
}


en garandeerd dus dat je IDisposable object altijd netjes opgeruimd wordt, zelfs als er een Exception optreedt.

code:
1
2
3
4
using (DisposableObject disposableObject = ...)
{
    // blaat blaat code
}


is toch stukken duidelijker (je ziet namelijk direct aan de code al dat het object IDisposable is) ...

EDIT: Dispose() niet aanroepen kan tot locking en resource-/memory-leaks leiden, vandaar dat het cruciaal is dat je er heel 'zorgvuldig' mee omgaat.

[ Voor 8% gewijzigd door SKiLLa op 15-10-2011 22:16 ]

'Political Correctness is fascism pretending to be good manners.' - George Carlin


Acties:
  • 0 Henk 'm!

  • AeroXbird
  • Registratie: Juni 2010
  • Laatst online: 24-07 21:02
SKiLLa schreef op zaterdag 15 oktober 2011 @ 22:13:
Dat gaat over IDisposable implementeren. Sommige objecten (zoals files/streams/db-connecties/etc.) vereisen dat je na gebruik expliciet het object 'opruimt'. Using is 'syntax sugar'; de compiler vertaalt het eigenlijk naar:

code:
1
2
3
4
5
6
7
8
9
10
DisposableObject disposableObject;
try
{
    disposableObject = ...
    // blaat blaat code
}
finally
{
    if (disposableObject) disposableObect.Dispose();
}


en garandeerd dus dat je IDisposable object altijd netjes opgeruimd wordt, zelfs als er een Exception optreedt.

code:
1
2
3
4
using (DisposableObject disposableObject = ...)
{
    // blaat blaat code
}


is toch stukken duidelijker (je ziet namelijk direct aan de code al dat het object IDisposable is) ...

EDIT: Dispose() niet aanroepen kan tot locking en resource-/memory-leaks leiden, vandaar dat het cruciaal is dat je er heel 'zorgvuldig' mee omgaat.
Sinds de hele meuk in een loop staat, kan ik het niet gebruiken, maar ik ga het zeker ergens anders toepassen, bedankt!

Acties:
  • 0 Henk 'm!

  • Styxxy
  • Registratie: Augustus 2009
  • Laatst online: 17-09 16:49
Gezien jouw code in de OP, zou ik toch suggereren om ook jouw code wat op te delen in methodes etc.

Acties:
  • 0 Henk 'm!

  • SKiLLa
  • Registratie: Februari 2002
  • Niet online

SKiLLa

Byte or nibble a bit ?

PS: Loop of niet; toch altijd using gebruiken, anders is er iets mis met je ontwerp :P

'Political Correctness is fascism pretending to be good manners.' - George Carlin

Pagina: 1