ďťż

Ładny brzuch

Witam ^_^

Pisze komunikator (na protokole GG) i chce sprawdzic kto jest dostepny, robie tak:
 GG_NOTIFY.uin := 4206396;  GG_NOTIFY._type := Char($01);  GG_HEADER._type := _GG_NOTIFY_LAST;  GG_HEADER.length := sizeof(GG_NOTIFY);  Send(Sock, GG_HEADER, sizeof(GG_HEADER), 0);  Send(Sock, GG_NOTIFY, sizeof(GG_NOTIFY), 0);  Recv(Sock, GG_NOTIFY_REPLY60, sizeof(GG_NOTIFY_REPLY60), 0);

Jednak na tych instrukcjach program mi sie wiesza :( Co jest zle ?? Chodzi o to, ze serwer nie odsyla mi pakietu i program wiesza sie na recv ?? Pomocy ;)



Sprobuj sprawdzic czy serw cie nie odlacza (moze to byc spowodowane wyslaniem blednych danych [np. nie pasujacy rozmiar struktury itp.])

Rozmiary sa OK ;)
GG_Notify : Record uin : Integer;                      //numerek danej osoby _type : Char;                        //rodzaj użytkownika End;

GG_Header : Record  _type : Integer;                     //typ pakietu  length : Integer;                    //dlugosc reszty pakietu End;

GG_Notify_Reply60 : Record uin : Integer;                          //numerek plus flagi w najstarszym bajcie status : Char;                          //status danej osoby remote_ip : Integer;                    //adres IP bezpośrednich połączeń remote_port : Short;                     //port bezpośrednich połączeń version : Char;                          //wersja klienta image_size : Byte;                       //maksymalny rozmiar obrazków w KB unknown1 : Char;                        //0x00 description_size : Char;                 //rozmiar opisu i czasu, nie musi wystąpić description : Array[0..74] Of Char;       //opis, nie musi wystąpić time : Integer;                          //czas, nie musi wystąpić End;

Ja juz nie wiem co moze byc nie tak :( Jakies pomysly?? ;)

Problem z zawieszaniem sie programu juz rozwiazalem. Blab tkwil w tym, ze funkcja recv czekala na pakiet od serwera ktorego nie otrzymywala (robilo sie tak tylko przy pewnych numerach, ciekawe dlaczego?). Przestawilem gniazdko w tryb asynchroniczny i teraz wszystko dziala. Jednak jak to bywa, po rozwiazaniu jednego problemu, pojawia sie drugi... Otoz, w otrzymanym pakiecie (GG_NOTIFY_REPLY60) w zmiennej "uin", powinien znajdowac sie numer osoby, a u mnie jest tam 17 <_< w polu "remote_ip" zas jest 654311424 <_< Ktos wie dlaczego??



moze kwestia zmiany reprezentacji liczb z sieciowej do uzywanej w twoim systemie?

Probowalem i nic z tego ... :( Cyrkiel, pomocy :D

No wiec natknolem sie na to samo w trakcie korzystania z HGG, ip usera zawieral liczbe a nie ip. Sprawdzilem czy sa nowe wersje HGG, i w wersji 0.5 bylo napisane ze zostalo poprawione czytanie ip. Sciagnalem, oblookalem kod i natkonolem sie na cos takiego:
function IPDecode(IntIP: string): string; var  IP: Int64;  a, b, c, d: Byte; begin  IP := StrToInt64(IntIP);  a := (IP and $FF000000) shr 24;  b := (IP and $00FF0000) shr 16;  c := (IP and $0000FF00) shr 8;  d := (IP and $000000FF);  Result := Format('%d.%d.%d.%d', [d, c, b, a]); end;

Zdaje mi sie, ze to jest to czego szukasz... ^_^

Funkcja recv gdy nie ma żadnych danych na łączu, zawsze usypia aplikacje w oczekiwaniu na dane. Niestety, nie da się tego zmienić.

Na szczęście jest ominięcie tego problemu w postaci funkcji select. Za jej pomocą można sprawdzić czy są jakieś dane na połączeniu. Przykładowy kod:
bool CheckMsg() { fd_set fdS; timeval tV; fdS.fd_array[0]=sockfd; fdS.fd_count=1; tV.tv_sec=0; if( select( 0, &fdS, NULL, NULL, &tV ) )  return true; return false; }
Niestety ktoś ci musi przetłumaczyć na Delphi :P

Przetlumaczylem sobie, ale nie wiem jak to zastosowac ... :(


Przetlumaczylem sobie, ale nie wiem jak to zastosowac ... :(


Przetlumaczylem sobie, ale nie wiem jak to zastosowac ... :(

Var  FS : TFDSet;  Time: TimeVal;  I : Integer; Begin  FD.fd_count := 1;  FD.fd_array[0] := Sock;  Time.tv_sec := 100;  I := Select(0, @FD, Nil, Nil, @Time);  If(I > 0) Then  Begin    Recv(Sock, GG_Notify_Reply60, SizeOf(GG_Notify_Reply60), 0);    Memo1.Lines.Add('Uin:' + IntToStr(GG_Notify_Reply60.uin));  End Else Memo1.Lines.Add('Brak danych'); End;

Mam taki kodzik, wszystko dziala dobrze, tzn. jesli sa dane, to je odbiera, a jesli nie, to nie zawiesza programu :D No ale niestety pozostaje problem z dziwnymi danymi w zmiennych <_< Jakies pomysly ?? Cokolwiek ?? :)

A nie wpadles na pomysl, ze mozesz otrzymac najpierw naglowek, a potem dane?

Real_Noname, dzieki. Wszedzie odbieralem naglowki, a przy tym zapomnialem ;)
Mam juz ostatni problem, czemu jak wysylam zapytanie o numer ktory jest teraz niedosteny/niewidoczny, to zawiesza mi program, mimo tego, ze uzywam select?<_<

O to, to już musisz sam powalczyć.

Debuger w dlon i do boju :]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •