Ĺ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
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 :]