[C#] Welbepaalde regel in Streamreader response extraheren

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • speedzor
  • Registratie: Maart 2008
  • Laatst online: 01-02-2014
Hey

Ik ben bezig met m'n eigen MSN client te ontwikkelen. Om dit te doen moet ik steeds commando's verzenden en hun response extraheren.
Dit is tot nu toe steeds eenvoudig gelukt omdat de response uit slechts 1 regel bestond. Echter ben ik nu toegekomen aan een response die uit meerdere regels bestaat en waarvan ik enkel de laatste wil hebben.

Alles valt te zien op volgend screenshot
http://img37.imageshack.us/i/72136022.jpg/

De code die ik gebruik om het commando met bijhorende parameters te verzenden zie je in het linkse scherm. Er tussen staan ook de codes die gebruikt worden om éénregelige responses eruit te halen.
Op het rechtse scherm zie je het netwerkverkeer gefiltert in WireShark op basis van MSNMS (het MSN protocol).
Zoals je ziet staat daar 'GCF 0 4804' als eerste regel bij de response. Wat ik nodig heb is de laatste, 'USR 6 TWN etc etc'
In het Form1 venstertje zie je de output van mijn code.

Ik heb het vermoeden dat dit opgelost kan worden door de indexwaarde van de U in 'USR 6 TWN' te zoeken, maar vind niet hoe dit gedaan moet worden. IndexOf kan niet zoeken op een string met meerdere karakters en als ik hem enkel op 'U' laat zoeken, dan geeft ie uiteraard niet de juiste waarde wegens meerdere keren dat het voorkomt.

Ik heb op MSDN lopen zoeken achter relevante methodes, maar vond geen oplossing.
Verder maak ik dus gebruik van Visual C# 2008 Express, Windows 7 64-bit en .NET 3.5.

Heb ik ergens over gekeken, of hoe zouden jullie dit doen?
Het is waarschijnlijk niet de meest nette code, dat geeft niet :) Ben een redelijke beginner hierin, de grote opkuis komt van zodra er wat meer functionaliteit in het programma is.

Jeroen

Streaming History


Acties:
  • 0 Henk 'm!

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
speedzor schreef op zondag 27 december 2009 @ 17:27:
Ik heb het vermoeden dat dit opgelost kan worden door de indexwaarde van de U in 'USR 6 TWN' te zoeken, maar vind niet hoe dit gedaan moet worden. IndexOf kan niet zoeken op een string met meerdere karakters en als ik hem enkel op 'U' laat zoeken, dan geeft ie uiteraard niet de juiste waarde wegens meerdere keren dat het voorkomt.
Ik denk dat je er overheen hebt gekeken - IndexOf kan ook het eerste voorkomen van een string bepalen, zie http://msdn.microsoft.com/en-us/library/7cct0x33.aspx ;)
Dit is tot nu toe steeds eenvoudig gelukt omdat de response uit slechts 1 regel bestond. Echter ben ik nu toegekomen aan een response die uit meerdere regels bestaat en waarvan ik enkel de laatste wil hebben.
Ik ben niet zo bekend met het MSN protocol (anders dat het tekstgebaseerd is, een beetje a la pop3 of ftp geloof ik), maar ik denk dat je beter af bent wanneer je kunt bepalen waar het eerste commando eindigt (dus door het eerste commando te "begrijpen", niet door naar het 2e commando te zoeken). Zegt de protocoldocumentatie iets over hoe je het einde van een willekeurig commando kunt bepalen?

En voor dit commando specifiek: is die 4804 in "GCF 0 4804" toevallig het aantal karakters (of bytes, dit hoeft niet hetzelfde te zijn) in de message? Zo ja, dan weet je ook hoe je bij je volgende commando uit kunt komen...
Alles valt te zien op volgend screenshot
http://img37.imageshack.us/i/72136022.jpg/
Geinig om te zien dat wireshark ook het MSN messenger protocol herkent, dat wist ik heel niet :)

Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Aangaand van het wireshark screenshot lijkt het erop als er inderdaad een text command richting de server gaat en er vervolgens een xml response terug komt. De value van de imtext elementen lijken base64 encoded.

Ook vermoed ik net als MrBucket dat die 4804 voor het aantal bytes staat welke je moet uitlezen. Met een XmlNodeReader kun je vervolgens eenvoudig dan de gewenste nodes uitlezen.

Neem anders even een kijkje op deze wiki: http://msnpiki.msnfanatic...hp/MSNP13:Example_Session

Waarschijnlijk als je even een beetje verder googled kun je nog wel meer informatie achterhalen.

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • Phyxion
  • Registratie: April 2004
  • Niet online

Phyxion

_/-\o_

IndexOf kan zeker wel een string aan hoor.

'You like a gay cowboy and you look like a gay terrorist.' - James May


Acties:
  • 0 Henk 'm!

  • Maxxi
  • Registratie: Mei 2004
  • Laatst online: 19-04 19:18
Maar IndexOf op 1 regel lost het probleem toch niet op als de response op twee regels staat?

Of lees ik het nu niet goed?

Zelf heb ik een beetje het zelfde probleem gehad:
[Java] Regex multiple line

De conclusie was dat je meerdere regels inleest en achter elkaar plakt.
En op het moment dat er geen data meer is de IndexOf (of zoals in mijn geval de Regex).

Acties:
  • 0 Henk 'm!

  • speedzor
  • Registratie: Maart 2008
  • Laatst online: 01-02-2014
Ook vermoed ik net als MrBucket dat die 4804 voor het aantal bytes staat welke je moet uitlezen. Met een XmlNodeReader kun je vervolgens eenvoudig dan de gewenste nodes uitlezen.
Inderdaad, de 4804 staat voor het aantal bytes die er volgen.
Maar de regel die ik nodig heb staat niet meer in het XML gedeelte, wat heb ik dan aan de XmlNodeReader?
Ik denk dat je er overheen hebt gekeken - IndexOf kan ook het eerste voorkomen van een string bepalen, zie http://msdn.microsoft.com/en-us/library/7cct0x33.aspx ;)
Hehe bedankt, ik was in de overtuiging dat dit enkel met één karakter kon :D
Ik ben niet zo bekend met het MSN protocol (anders dat het tekstgebaseerd is, een beetje a la pop3 of ftp geloof ik), maar ik denk dat je beter af bent wanneer je kunt bepalen waar het eerste commando eindigt (dus door het eerste commando te "begrijpen", niet door naar het 2e commando te zoeken). Zegt de protocoldocumentatie iets over hoe je het einde van een willekeurig commando kunt bepalen?
Volgens de documentatie wordt er na elk commando 'CVR0' geplaatst, echter heb ik nog geen responses van de server gekregen waarin dit voorkomt. Ik vermoed dus dat de documentatie hierin ietwat outdated is.


Nu ik weet dat ik IndexOf kan gebruik ziet het er al wat beter uit. Enige probleem waar ik nu tegenaan loop is dat ik geen NSStreamreader.ReadToEnd kan gebruiken volgens MSDN.
For interactive protocols, in which the server sends data only when you ask for it and does not close the connection, ReadToEnd might block indefinitely and should be avoided
M'n programma loopt dan ook steeds vast :P
Morgen zoek ik eens uit hoe ik in de plaats daarvan .Read kan gebruiken..

Bedankt voor de replies in ieder geval ;)

Streaming History


Acties:
  • 0 Henk 'm!

  • Styxxy
  • Registratie: Augustus 2009
  • Laatst online: 17-09 16:49
speedzor schreef op maandag 28 december 2009 @ 19:50:
Volgens de documentatie wordt er na elk commando 'CVR0' geplaatst, echter heb ik nog geen responses van de server gekregen waarin dit voorkomt. Ik vermoed dus dat de documentatie hierin ietwat outdated is.
Er is ook geen documentatie beschikbaar over MSNP18. Er is slechts documentatie tot MSNP15 beschikbaar. Daarna is het maar gissen wat het allemaal doet.

EDIT
Blijkbaar is er nu al wel MSNP18 documentatie. Tijdje geleden toen ik zocht, was er nog geen. Ignore this post ;).

[ Voor 11% gewijzigd door Styxxy op 29-12-2009 02:06 ]


Acties:
  • 0 Henk 'm!

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 01:05

Reptile209

- gers -

speedzor schreef op maandag 28 december 2009 @ 19:50:
[...]
Volgens de documentatie wordt er na elk commando 'CVR0' geplaatst, echter heb ik nog geen responses van de server gekregen waarin dit voorkomt. Ik vermoed dus dat de documentatie hierin ietwat outdated is.
Typo denk ik? Ieder commando wordt met \r\n afgesloten, daarna volgt een eventuele payload waarvan het aantal bytes in het commando wordt meegegeven. Zie de voorbeeldsessie op MSNPiki.

De makkelijkste manier van data lezen is (denk ik) een aparte thread die constant de verbinding pollt op nieuwe data (met bijv. een 100 ms timeout om te kunnen checken op het aborten van de thread) en dat aan een buffer toevoegt. Zodra je een compleet commando (+eventuele payload) hebt, kan je je app triggeren om er wat mee te gaan doen. Nadeel is wel dat de reader dan een beetje kennis van het protocol nodig heeft, om onderscheid te maken tussen commando's met en zonder payload.

Zo scherp als een voetbal!


Acties:
  • 0 Henk 'm!

  • Phyxion
  • Registratie: April 2004
  • Niet online

Phyxion

_/-\o_

Maxxi schreef op maandag 28 december 2009 @ 19:32:
Maar IndexOf op 1 regel lost het probleem toch niet op als de response op twee regels staat?

Of lees ik het nu niet goed?

Zelf heb ik een beetje het zelfde probleem gehad:
[Java] Regex multiple line

De conclusie was dat je meerdere regels inleest en achter elkaar plakt.
En op het moment dat er geen data meer is de IndexOf (of zoals in mijn geval de Regex).
Zet je toch alles achter elkaar en haal je \r\n eruit?

'You like a gay cowboy and you look like a gay terrorist.' - James May

Pagina: 1