[MSN PROTOCOL] Verdere implementatie vragen

Pagina: 1
Acties:
  • 108 views sinds 30-01-2008
  • Reageer

  • Parcye
  • Registratie: Maart 2001
  • Laatst online: 24-08-2017
Ik ben zoals zovelen bezig het MSN protocol in een eigen applicatie te implementeren. (Delphi, maar niet relvant omdat het om methodes niet om code gaat)

Nu is eigenlijk alles gelukt wat betreft het implementeren alleen zijn er natuurlijk een hoop dingen die ik me afvraag. Misschien dat jullie mij kunnen vertellen hoe jullie het oplossen of zouden oplossen.

Probleem 1:
Bij het opvragen van de lijst met gebruikers door de SYN commando gevolgd door commandcount en een nummer (ik pak altijd 0) krijg ik een hele grote hoeveleheid data binnen, alles brokken van precies 2048.
Als je dit doet, komt het wel eens voor dat een stuk data in een nieuw pakket komt.

Zoals:
code:
1
2
  LST 4 FL 39
< 6 6 ikke@mijnmail.com Ik%20ben%20Test 2


Hoe lossen jullie dit op? Stoppen jullie alles in een buffer tot er een nieuw command komt?

Op het moment handel ik alle binnen gekomen data meteen af, dus komt er een reeks van 2048 bytes met gebruikers lijst binnen hack ik dat in strings door de #13#10 te vinden en werk ik string voor string af, alleen kom je dus op een gegevens moment bij een string 'LST 4 FL 39' Ik zie, LIJST commando, antwoord op mijn 4de commando, FORWARDLIST en lijst versie 39, maar ik weet dus niet wie en die is dan dus verloren...

De andere vraag aan jullie is hoe bouwen jullie contact lists op, ik zet ze op het moment gewoon allemaal in de lijst als ze in de FL lijst voorkomen met offline en als de LNL commando binnen komt verander die die mensen van status. De groepen die zet ik er ook bij op het moment dat ik ze binnen krijg maar ik heb dus gewoon een aantal regels onder elkaar... Maar hoe doen jullie dat dus?

"Als je het kan bedenken, kan het gemaakt worden" Parcye - 14 januari 2002


  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 22:51

Reptile209

- gers -

Ik gebruik altijd TIdTCPClient.ReadLn() om de lijsten binnen te halen, dan vindt de splitsing/samenvoeging van de pakketten ergens anders plaats :). Zo krijg ik iig alle info van een user in één blok tegelijk.

offtopic:
Mocht je 'm nog niet kennen, kijk dan ook eens op deze site voor de specificaties/implementatie van MSN Messenger. Evenals (op dezelfde site) hier, waar je het draft van MSN Messenger Service 1.0 Protocol vindt. Als jij nog een mooie hebt, m'n mailadres staat in mijn profiel :)

Zo scherp als een voetbal!


  • Parcye
  • Registratie: Maart 2001
  • Laatst online: 24-08-2017
Is dat een standaard component?

En ik heb dat officile MS protocol document gebruikt en dan de andere dignen van tweakers zoeken he :D nice to know I know how to search :)

[ Voor 70% gewijzigd door Parcye op 24-01-2003 03:37 ]

"Als je het kan bedenken, kan het gemaakt worden" Parcye - 14 januari 2002


  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 22:51

Reptile209

- gers -

Zie http://www.indyproject.org/Indy/WhatIsIndy.html
Indy is een hele handige set met netwerkcomponenten. Downloaden (gratis want Open Source) kan daar ook.

Zo scherp als een voetbal!


  • Wupsje
  • Registratie: Januari 2001
  • Laatst online: 13-11-2024
Je zal inderdaad een FIFO buffer moeten gaan gebruiken.
Daarna een regel als compleet beschouwen als je er een CR LF (#13 #10) achteraan hebt staan. En die dan gaan processen.

  • Parcye
  • Registratie: Maart 2001
  • Laatst online: 24-08-2017
Dus als de package size 2048 (max) is dan en laatste 2 tekens niet #13 #10 zijn weet je dus dat de volgende package er ook bij hoort, tot er eentje tegen komt die <2048 of 2048 en laatste 2 tekens #13 en #10 zijn, Deze zou je dus tijdelijk in een TStringList kunnen op slaan door .Text + Inkomende data te doen.... en een boolean omzetten zodra je einde van je data bent gekomen..

"Als je het kan bedenken, kan het gemaakt worden" Parcye - 14 januari 2002


  • Orphix
  • Registratie: Februari 2000
  • Niet online
Ik gebruik voor mijn lib verschillende regular expressions om de commando's eruit te filteren. In deze expressie test ik altijd op het eindigen van een \r\n, dus een half commando komt er dan niet doorheen (en moet wachten tot de volgende iteratie wanneer de buffer wordt bijgevuld)

Dat over die lijsten begrijp ik niet helemaal wat je probleem nou is? Ik heb alle contactpersonen in 1 grote lijst staan, maar door verschillende iterators te gebruiken kan je bv alleen de allowed of blocked contacten gebruiken.

  • Parcye
  • Registratie: Maart 2001
  • Laatst online: 24-08-2017
Inmiddels heb ik met de oplossingen hier een verandering gemaakt in me programma.

Bij het lezen van de data werk ik nu met een buffer.

Delphi:
1
2
3
4
5
6
7
8
  data := Socket.ReceiveText;
  DataList.Text := DataList.Text + data;
  DoData := false;
  if Length(data)=2048 then
  begin
    if ((data[2047]=#13)and(data[2048]=#10)) then DoData := true;
  end
  else DoData := true;


En pas als DoData true is dan wordt alles verwerkt. DataList is een TStringList.

[ Voor 3% gewijzigd door Parcye op 24-01-2003 15:24 ]

"Als je het kan bedenken, kan het gemaakt worden" Parcye - 14 januari 2002

Pagina: 1