'k heb een poging gedaan om een NetworkStream te coderen met behulp van de CryptoStream class uit System.Security.CryptoGraphy. 'k ben daar alleen nog niet echt in geslaagd. Ik vraag me alleen af of het aan die CryptoStream ligt. 'k heb het volgende stukje code geschreven om de verbinding vanaf de client side op te bouwen:
'k heb de nummers voor de key ffies met een sterretje aangegeven, want 'k moet hebben dat anderen die key en IV gaat gebruiken
.
Ik heb het hele try block maar even weg gelaten omdat dat nogal wat regeltjes code opleverde. Deze try klopt uiteraard en de verbinding wordt ook zonder problemen op gebouwt. Alleen in de laatste regel van de bovenstaande code stuur ik data. Deze data komt echter niet goed aan op de server.
Op de server kant heb ik een class geschreven om alle verbindingen in te bewaren (daar heb ik al eens eerder wat over gepost). Ook hier wordt de verbinding op de goede manier tot stand gebracht, en de verbinding ligt er. Vervolgens maak ik een System.Timers.Timer en deze laat ik elke 1 milliseconde (interval = 1) controleren of er data beschikbaar is. Ik heb het idee dat dit op een nettere manier moet kunnen, maar ik heb geen flauw idee. Vroeger had je met de Winsock control in VB6 gewoon een Data_Arrival event, maar 'k heb geen flauw idee hoe ik dat moet realiseren in .NET. In ieder geval, in de Elapsed event van die timer heb ik de volgende code geschreven:
HandleData is een void die 'k zelf heb geschreven. Het probleem is alleen dat op de een of andere manier het programma vastloopt op die ReadToEnd regel. Er gebeurdt daarna niets meer. En als ik herhaaldelijk een verbinding probeer te maken vanuit het client programma dan komt heel soms de data opeens wel aan. Maar het is natuurlijk wel de bedoeling dat de data altijd aankomt.
'k heb al eens ffies gegoogled, en ik las daar dat de NetworkStream geen seeking ondersteund omdat de stream geen lengte heeft. Dat zou dus kunnen betekenen dat ReadToEnd niet werkt. ReadToLine werkt echter ook niet, en anders moet ik byte voor byte inlezen. Ik lees in andere berichten echter weer dat het wel met een StreamReader moet kunnen.
Kortom, iemand een idee waarom dit niet werkt? Heb al van alles geprobeerd, maar tot nu toe nog niets gehad wat werkt.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
| (try block, bevat o.a):
tcpConnector = new TcpClient(txtConnectTo.Text, Convert.ToInt32(txtPort.Text));
(/try)
tcpStream = tcpConnector.GetStream();
byte[] Key = {0x**, 0x**, 0x**, 0x**, 0x**, 0x**, 0x**, 0x**, 0x**, 0x**, 0x**, 0x**, 0x**, 0x**, 0x**, 0x**};
byte[] IV = {0x**, 0x**, 0x**, 0x**, 0x**, 0x**, 0x**, 0x**, 0x**, 0x**, 0x**, 0x**, 0x**, 0x**, 0x**, 0x**};
tcpCryptoRead = new CryptoStream(tcpStream, tcpEncryptor.CreateDecryptor(Key, IV), CryptoStreamMode.Read);
tcpCryptoWrite = new CryptoStream(tcpStream, tcpEncryptor.CreateEncryptor(Key, IV), CryptoStreamMode.Write);
tcpCryptoReader = new StreamReader(tcpCryptoRead);
tcpCryptoWriter = new StreamWriter(tcpCryptoWrite);
tcpCryptoWriter.AutoFlush = true;
tcpCryptoWriter.WriteLine("IDENT/" + txtPassword.Text); |
'k heb de nummers voor de key ffies met een sterretje aangegeven, want 'k moet hebben dat anderen die key en IV gaat gebruiken
Ik heb het hele try block maar even weg gelaten omdat dat nogal wat regeltjes code opleverde. Deze try klopt uiteraard en de verbinding wordt ook zonder problemen op gebouwt. Alleen in de laatste regel van de bovenstaande code stuur ik data. Deze data komt echter niet goed aan op de server.
Op de server kant heb ik een class geschreven om alle verbindingen in te bewaren (daar heb ik al eens eerder wat over gepost). Ook hier wordt de verbinding op de goede manier tot stand gebracht, en de verbinding ligt er. Vervolgens maak ik een System.Timers.Timer en deze laat ik elke 1 milliseconde (interval = 1) controleren of er data beschikbaar is. Ik heb het idee dat dit op een nettere manier moet kunnen, maar ik heb geen flauw idee. Vroeger had je met de Winsock control in VB6 gewoon een Data_Arrival event, maar 'k heb geen flauw idee hoe ik dat moet realiseren in .NET. In ieder geval, in de Elapsed event van die timer heb ik de volgende code geschreven:
code:
1
2
3
| if (mvarStream.DataAvailable == false) return; tempdata = mvarCryptoReader.ReadToEnd(); HandleData(tempdata); |
HandleData is een void die 'k zelf heb geschreven. Het probleem is alleen dat op de een of andere manier het programma vastloopt op die ReadToEnd regel. Er gebeurdt daarna niets meer. En als ik herhaaldelijk een verbinding probeer te maken vanuit het client programma dan komt heel soms de data opeens wel aan. Maar het is natuurlijk wel de bedoeling dat de data altijd aankomt.
'k heb al eens ffies gegoogled, en ik las daar dat de NetworkStream geen seeking ondersteund omdat de stream geen lengte heeft. Dat zou dus kunnen betekenen dat ReadToEnd niet werkt. ReadToLine werkt echter ook niet, en anders moet ik byte voor byte inlezen. Ik lees in andere berichten echter weer dat het wel met een StreamReader moet kunnen.
Kortom, iemand een idee waarom dit niet werkt? Heb al van alles geprobeerd, maar tot nu toe nog niets gehad wat werkt.