Odbieranie, wysyłanie pakietów (np sockety)

0

Witajcie. Piszę w dziale newbie, gdyż problem wydaje mi się naprawdę banalny oraz moje umiejętności z obsługą różnej maści komponentów do obsługi sieci (sockety, synapse, winsock i inne) są praktycznie zerowe. (jestem totalnym laikiem)

Od pewnego czasu męczę się z implementacją protokołu Gadu-Gadu (http://toxygen.net/libgadu/protocol/).
Staram opierać się na gotowym komponencie TEasyGG, który obsługuję tą sieć.
Korzystam z Delphi 2010.

część 1.2. Zanim się połączymy udało mi się zaimplementować, pobieram bez problemów host oraz port, ale problem pojawia się dalej.

A mianowicie z wysyłaniem i odbieraniem pakietów.
Zacznijmy może od początku. Jaka biblioteka byłaby do tego najlepsza (najłatwiejsza)?

Zaraz po połączeniu do serwera musimy odebrać pakiet:

#define GG_WELCOME 0x0001

który w Delphi wygląda tak: const GG_WELCOME = $0001;


Na wypróbowanie położyłem na formę komponent idTCPClient i napisałem taki kod:

```delphi
var
  Host: Ansistring;
  Port: Integer;
begin
  GetHost(0, Host, Port);
  IdTCPClient1.Port := Port;
  IdTCPClient1.Host := Host;
  IdTCPClient1.Connect;

  if IdTCPClient1.IOHandler.ReadByte = GG_WELCOME then
    ShowMessage('Witamy!')
  else
    ShowMessage('zegnamy!'); 

procedura GetHost jest żywcem wzięta z komponentu TEasyGG (pierwszy parametr numer GG (0)- dalej wiadomo. Parametry Host i Port przekazywane są przez referencję)

Zgodnie z opisem protokołu zaraz po połączeniu serwer powinien nam wysłać pakiet GG_WELCOME. Problem jaki mi się pojawił to jak ten pakiet wychwycić? Jak go odebrać? Zacząłem kombinować i skutkiem jest kod powyżej. Czy jest to prawidłowe odebranie tego pakietu? (Komunikat "Witamy!" się pokazuje). Jeżeli nie, to w jaki sposób profesjonalnie pakiety odebrać?

Ok, przyjmijmy że odebrałem pakiet GG_WELCOME. Następnie serwer wysyła ziarno:

 struct gg_welcome {
	int seed;	/* ziarno */
};

w Delphi:

 type
  Pgg_welcome = ^Tgg_welcome;
  Tgg_welcome = packed record
    seed: LongWord; 
  end;

jak mam to odebrać? Jak wysyłać inne pakiety?

Trochę się rozpisałem, mam nadzieję że wszystko jest jasne. Do wysyłania wiem, że istnieje coś takiego jak idTCPClient.WriteBuffer(); i by nie było żadnego problemu, ale nie mam czegoś takiego w delphi XE 2010. (Pewnie jest, ale jakoś ukryte).

Bardzo bym prosił o pomoc, gdyż ten problem ściąga mi sen z powiek a dla ludzi obeznanych w temacie jest na pewno śmieszny.
Pozdrawiam.

1

Nie mam doświadczenia z protokołem żadnego. O ile wiem, TEasyGG nadal powinno działać ok, z tym że jest problem gdy liczba dodanych kontaktów jest w okolicach 140 lub powyżej. Nie można wtedy w sposób prawidłowy otrzymywać o nich właściwych danych. Natomiast do obsługi protkołu TCP zarówno jako klient jak i serwer mogę plecić Simple TCP: http://piechnat.pl/article/simpletcp.html bardzo mi się przydał, bo korzysta z czystego WinSock, także jest też idealny do pisania w WinAPI.

0

Doszedłem do wniosku, że spróbuję oprzeć wszystko na komponencie TClientSocket (w zdarzeniu OnRead będę odbierał pakiety itd).
Może ktoś już kiedyś z tym walczył i udało mu się poprawnie zalogować do GG? Nie chcę korzystać z gotowych komponentów (TEasyGG).
Bardzo bym prosił o pomoc, bo nie ukrywam że strasznie mi na tym zależy, a przeczesałem już pół internetu na ten temat i w większości wszystko jest w C++ albo jest zbytnio pogmatwane:)

Pozdrawiam.

edit: Pierwszy sukces: udało mi się "prawie" zalogować do GG. (prawie tzn. pojawiam się na sekundę i mnie rozłącza, ale czuję, że jestem już blisko). Używam TClientSocket.

edit2: Udało się zalogować bez problemu do GG. (tamten błąd był spowodowany tym, że nie odbierałem jednego pakietu)

1 użytkowników online, w tym zalogowanych: 0, gości: 1