ďťż

Ładny brzuch

Otóż zrobiłem prosty prorgamik który ma za zadanie łączenie się z portem 8074, jest tak prosty że aż dziwie się że nie działa - i nie wiem czy jest to błą w kodzie czy może coś z moim komputerem jest nie tak (no ale działa gg to i to powinno działać). Oto kod:

#include <iostream.h> #include <winsock2.h> main() { SOCKET sock; sock = socket(AF_INET,SOCK_STREAM,0); struct sockaddr_in sin; sin.sin_addr.s_addr = inet_addr("192.168.0.90"); sin.sin_family = AF_INET; sin.sin_port=htons(8074); if(connect(sock,(struct sockaddr *)&sin,sizeof(sin))==SOCKET_ERROR) cout << "Polaczone!!"; else cout << "NIe polaczone"; getchar(); }

nie wiem czy może tam być błąd, ale jeśli tak to pomóźcie, bo ja już sobie nie radzę



ntohs zamiast htons ;)

Dzięki!! To pomogło!! Nawet nie wiesz jak jestem Ci wdzięczny

No ale teraz inne pytanie: Dlaczego? Jaka jest róznica między ntohs a htons?


Dzięki!! To pomogło!! Nawet nie wiesz jak jestem Ci wdzięczny

No ale teraz inne pytanie: Dlaczego? Jaka jest róznica między ntohs a htons?
Coś chyba pokręciłeś z kodem#include <iostream.h> #include <winsock2.h> main() { WSADATA wd; WSAStartup(0x101,&wd); SOCKET sock; sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); struct sockaddr_in sin; sin.sin_addr.s_addr = inet_addr("212.77.100.101"); sin.sin_family = AF_INET; sin.sin_port=htons(80); if(connect(sock,(struct sockaddr *)&sin,sizeof(sin))!=SOCKET_ERROR) cout << "Polaczone!!"; else cout << "NIe polaczone"; getchar(); }powinno być !=SOCKET_ERROR, teraz tak działa nawet z htons :unsure:
sprawdziłem i ntohs, i htons robią to samo - zamieniają kolejnością bajty z numerze portu (word) ;)
Użytkownik Cyrkiel edytował ten post 09 sierpień 2005, 21:49


Ale popatrz: na stronie http://www.kodmaker....insocklient.htm jest napiszen że ma być ==SOCKET_ERROR . I tutaj się pojawia pytanie - czy da się jakoś sprawdzić czy jestem połączony, czy jest jakaś funkcja ?


Ale popatrz: na stronie http://www.kodmaker....insocklient.htm jest napiszen że ma być ==SOCKET_ERROR . I tutaj się pojawia pytanie - czy da się jakoś sprawdzić czy jestem połączony, czy jest jakaś funkcja ? Jesteś podłączony, jeżeli funkcja connect zwróci 0 ;) Ty masz odwrotnie warunek, jeżeli jesteś połączony wywali "nie połączone" :P
Użytkownik Cyrkiel edytował ten post 10 sierpień 2005, 08:13
No dobra, niech będzie, ale ja chce sprawdzić czy jestem połączony - to czy jest taka funkcja co by to sprawdzała?


No dobra, niech będzie, ale ja chce sprawdzić czy jestem połączony - to czy jest taka funkcja co by to sprawdzała? Nie wiem o takiej funkcji. W trybie nieblokowanym otrzymujesz komunikat o rozłączeniu socket-u, a w blokowanym funkcje odczytujące i wysyłające dane zwracają 0, jeśji druga strona zakończy połączenie lub -1, jeżeli wystąpi błąd ;)

Przepraszam że tak długo nie odpisywałem, no ale zrobiłem tak jak chciałeś (jak coś daje jeszcze raz kod) - no i nie łąćzy się (może to wina komputera, internetu??)

#include <iostream.h> #include <winsock2.h> main() { SOCKET sock; sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); struct sockaddr_in sin; sin.sin_addr.s_addr = inet_addr("192.168.0.90"); sin.sin_family = AF_INET; sin.sin_port=htons(8074); if(connect(sock,(struct sockaddr *)&sin,sizeof(sin))==0) cout << "Polaczone!!"; else cout << "NIe polaczone"; getchar(); }

No i jeszcze jedno pytanie (wydawało mi się że przekleiłeś kod ale się pomyliłem)

Co to jest :
WSAStartup(0x101,&wd);
i
sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); -tutaj chodzi mi dokładnie o parametr IPPROTO_TCP ja zawsze dawałem 0 - jaka jest różnica?
Użytkownik sh4rk edytował ten post 14 sierpień 2005, 13:19

Dodaj tylko na początekWSADATA wd; WSAStartup(0x101,&wd);  <- inicjalizacja socket-ów;) i powinno działać. IPPROTO_TCP jest od prokołu tcp, możesz także użyć IPPROTO_UDP dla udp (wtedy zamiast SOCK_STREAM daj SOCK_DGRAM).
BTW #define IPPROTO_IP 0 ;) ipproto_ip jest podobny do tcp ;)
Użytkownik Cyrkiel edytował ten post 14 sierpień 2005, 13:55
Bardzo głupi mi zamęczać Ciebie tymi pytaniami, no ale cóż - zainicojawałem te sokety i tak nie działa (jak coś umieszczam kod poniżej). No ale może jest błąd nie w programi tylko w kompterze??
#include <iostream.h> #include <winsock2.h> main() { WSADATA wd; WSAStartup(0x101,&wd); SOCKET sock; sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); struct sockaddr_in sin; sin.sin_addr.s_addr = inet_addr("192.168.0.90"); sin.sin_family = AF_INET; sin.sin_port=htons(8074); if(connect(sock,(struct sockaddr *)&sin,sizeof(sin))==0) cout << "Polaczone!!"; else cout << "NIe polaczone"; getchar(); }

Teraz dziala, przynajmniej u mnie :D
#include <iostream> #include <winsock2.h> #include <conio.h> using namespace std; int main(int argc, char* argv[]) {    WSADATA WsaData;    SOCKET Sock;    WSAStartup (MAKEWORD (2, 0), &WsaData);    struct sockaddr_in Sin;        Sock = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);    Sin.sin_family = AF_INET;    Sin.sin_addr.s_addr = inet_addr ("127.0.0.1");    Sin.sin_port = htons (8074);    bind (Sock, (struct sockaddr*)&Sin, sizeof (sockaddr));    connect (Sock, (struct sockaddr*)&Sin, sizeof (struct sockaddr));        getch();    closesocket (Sock);    WSACleanup ();    return 0; }

Nie wiem czemu ale u mnie standardowo się nie łączy :(:(:( - to więc jak u Was działa to powinno i u mnie, ja jakoś jestem przekonania że to może wina komputera/internetua -ale czy to jest możliwe??


Nie wiem czemu ale u mnie standardowo się nie łączy :(:(:( - to więc jak u Was działa to powinno i u mnie, ja jakoś jestem przekonania że to może wina komputera/internetua -ale czy to jest możliwe?? U mnie działa :mellow: Możesz po funkcji connect dać WSAGetLastError i napisać tu wynik (liczba)?

Dałem WSAGetLastError no i pokazał mi się numer 10060


Dałem WSAGetLastError no i pokazał mi się numer 10060 ... czyli connection timed out :mellow: Diagnoza: nie uruchomiony serwer, zły ip/port lub firewall ;)


... czyli connection timed out :mellow: Diagnoza: nie uruchomiony serwer, zły ip/port lub firewall ;)

GG działa na innej zasadzie :)
Przez ten port łączysz się do serwera GG a nie z osobą którą chcesz rozmawiać :)

z poważaniem
Krzysztof Rzeszutek


Trzy pytania:
1.skąd wiesz że to znaczy ten błąd (bo skąd musisz wiedzieć)
2. Jak może być zły port?
3.Firewall - na moim komuterze, (u mnie jest zainstalowany router - to może przez to?), ale gg działą to to powinno chyba też...
1. Stąd: http://www.astatech....cket_Errors.htm
2. Tak, że serwer jest na innym, niż ten, na który się łączysz :P
3. Możesz mieć zablokowany ten port ;)


3. Możesz mieć zablokowany ten port ;)


GG działa na innej zasadzie :)
Przez ten port łączysz się do serwera GG a nie z osobą którą chcesz rozmawiać :)

z poważaniem
Krzysztof Rzeszutek

A skąd bierzesz adres serwera gg? Powinno się to uzyskiwać z http://appmsg.gadu-g...svc/appmsg4.asp ;)
Użytkownik Cyrkiel edytował ten post 17 sierpień 2005, 13:32
http://dev.null.pl/e...s/protocol.html
Ja zbudowałem SWOJE GG na podstawie tego tekstu :)
Powinno wystarczyć :P

z poważaniem
Krzysztof Rzeszutek


A skąd bierzesz adres serwera gg? Powinno się to uzyskiwać z http://appmsg.gadu-g...svc/appmsg4.asp ;)

Chyba powinienes odebrac to jako tablice znakow, ale nie wiem, bo c++ nie za dobrze znam... Wkazdym badz razie pamietaj o tym jak jest zbudowany pakiet: najpierw pole z poleceniem potem z dlugoscia reszty danych a potem reszta danych... (doklaniej jest to opisane na stronie z opisem protokolu GG)


Chyba powinienes odebrac to jako tablice znakow, ale nie wiem, bo c++ nie za dobrze znam... Wkazdym badz razie pamietaj o tym jak jest zbudowany pakiet: najpierw pole z poleceniem potem z dlugoscia reszty danych a potem reszta danych... (doklaniej jest to opisane na stronie z opisem protokolu GG)

Ja to odbierałem tak:int b[2]; recv(s,(char*) b,8,0); ;)


Ja to odbierałem tak:int b[2]; recv(s,(char*) b,8,0); ;)


Jesteś boski, działa bardzo dobrze
noa le o co to chodzi z tym (char *), często to spotykam tak samo (int *) i nie rozumiem, co to robi - zmienia chwilowa int na char ?
Nie wiem jak się to profesjonalnie nazywa, dla mnie jest to konwersja (tutaj potrzeba char*, a mamy int* ;)).

I jezscze jeden problem <_<

Wysłałem login i odebrałem ten pakiet i :o pokazało mi że ma długość 0x001 :o, a przecież może mi tylko pokazać 0x0003 albo 0x0009... coś jest nie tak,ale nie wiem co - jak zawsze jak coś daje kod:

#include <iostream.h> #include <winsock2.h> #define GG_WELCOME 0x0001 struct gg_welcome { int seed; }; #define GG_LOGIN60 0x0015 struct gg_login60 { int uin; int hash; int status; int version; char unknow1; int local_ip; short local_port; int external_ip; int external_port; char image_size; char unknown2; char descryption[]; int time; }; #define GG_SEND_MSG 0x000b struct gg_send_msg { int recipient; int seq; int klass; char message[]; }; struct gg_header { int type; int length; }; int gg_login_hash(char *password, unsigned int seed) {    unsigned int x,y,z;    y= seed;    for(x=0;*password;password++)    {    x= (x&0xffffff00) | *password;    y ^= x;  y += x;  x <<= 8;  y ^= x;  x <<= 8;  y -= x;  x <<= 8;  y ^= x;  z = y & 0x1f;  y = (y << z) | (y >> (32 - z)); } return y; } int main() {   WSADATA WsaData;   SOCKET sock;   WSAStartup (MAKEWORD (2, 0), &WsaData);   struct sockaddr_in sin;     sock = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);   sin.sin_family = AF_INET;   sin.sin_addr.s_addr = inet_addr ("217.17.41.93");   sin.sin_port = htons (8074);   bind (sock, (struct sockaddr*)&sin, sizeof (sockaddr));    cout << " Connecting..." << endl;   if(connect (sock, (struct sockaddr*)&sin, sizeof (struct sockaddr))==0)   cout << " Conncting success" << endl;   else cout << " Conecting  failure" << endl << "Error - " << WSAGetLastError() << endl;   listen(sock,SOMAXCONN);     struct gg_welcome gg_welcome;   char bufor[20];   if(recv(sock,(char *)gg_welcome.seed,sizeof(gg_welcome),0)) cout << "Seed received: " << gg_welcome.seed << endl;   else cout << "Error - seed ";     struct gg_login60 login;   char *password="haslo";   login.uin=1320288;   login.hash=gg_login_hash("haslo",gg_welcome.seed);   login.status= 0x0004;   login.version=0x21;   login.unknow1=0x00;   login.local_ip=0x00;   login.local_port=8074;   login.external_ip=0x00;   login.external_port=8074;   login.image_size=400;   login.unknown2=0xbe;     struct gg_header gg_header; gg_header.type=GG_LOGIN60; gg_header.length=sizeof(login); send(sock,(char *)&gg_header,sizeof(gg_header),0);   send(sock,(char *)&login,sizeof(login),0); if(recv(sock,(char*)&gg_header,sizeof(gg_header),0))   cout << "polaczylem sie z  0x" << gg_header.type << endl; else cout << "nie polaczylem sie";   getchar();   closesocket (sock);   WSACleanup ();   return 0; }

1. Po co masz bind() i listen() w kodzie?
2. Masz errora: przy pierwszym recv() - chcesz otrzymać dane do bufora zerowego. Popraw:  int gg_welcome[3];  if(recv(sock,(char*) gg_welcome,12,0)) cout << "Seed received: " << gg_welcome[2] << endl;  struct gg_login60 login;  char *password="haslo";  login.uin=x;  login.hash=gg_login_hash("haslo",gg_welcome[2]);Błąd: czekamy na 3 bajty - pierwszy = typ, drugi = ilość bajtów, trzeci = seed ;)
Użytkownik Cyrkiel edytował ten post 18 sierpień 2005, 21:04

Nie wiem jak się to profesjonalnie nazywa, dla mnie jest to konwersja (tutaj potrzeba char*, a mamy int* ;)).


Hmm, nie wiem czy to profosjonalna nazwa, ale jak dla mnie to to raczej jest rzutowanie a nie konwersja.... Właśnie - rzutowanie :P Nie znam się na c :D

i zalogowałem się na 0x0003 i mi nie pokazuje że jestem dostępny :/ cały czas niedostępny(sprawdzałęm na gg)... :/ - zmieniłem tak kod jak chciałeś


Właśnie - rzutowanie :P Nie znam się na c :D


i zalogowałem się na 0x0003 i mi nie pokazuje że jestem dostępny :/ cały czas niedostępny(sprawdzałęm na  gg)... :/ - zmieniłem tak kod jak chciałeśNo ale pewnie się mylę Bo jeszcze musisz wysłać pakiet o statusie :Pint status[3] = {2,4,2};  // <- 2 = GG_NEW_STATUS 0x0002, 4 = jeden bajt; 2 = status dostępny;) send(sock,(char*) &status,12,0); recv(sock,(char*) &status,12,0);przydałoby się jeszcze wysłać pakiet z informacjami komu chcesz pokazać swój status:int logf[4] = {16,8,numer,2}; // <-- 16 = GG_NOTIFY_LAST 0x0010; 8 = dwa bajty; numer = nr gg; 2 = GG_USER_FRIEND 0x02, czyli ktoś, kogo mamy na liście ustawionego tylko dla znajomych send(sock,(char*) &logf,16,0);
Użytkownik Cyrkiel edytował ten post 19 sierpień 2005, 12:52

Z tego co ja się znam (a mało się znam) to wydawało mi się że rzutowanie to coś takiego:
char znak='a'; znak++;


To jest post inkrementacja (ale czy zadziala na char to nie jestem pewny...).
// Nie jestem pewnien jak sie pisze: post inkrementacja / post-inkrementacja / postinkrementacja :P
1. Zadziała ;)
2. Pisze się postinkrementacja :P

Wiedziałem że jeszcze po drodze załapę jeden problem, (bo przecież nie możliwe żeby ktoś taki jak ja zrobił za 100 razem). No więc postyanowiłem że przeniose to wszystko na WinApi... wszystko dobrze działą - tylko że mi nie nasłuchuje ... :/. Myślałem może że ten kod mi to zrobi ale się myliłem :/ :
switch(WSAGETSELECTEVENT(lParam))   { case FD_READ:       recv(sock,(char*)&header,sizeof(header),0);        SetDlgItemText(uchwyt,100,"to  to");        if (header.type==GG_RECV_MSG)       {        recv(sock,(char*)&recv_msg,sizeof(recv_msg),0);       SetDlgItemText(uchwyt,100,recv_msg.message);       } break; } break;
Nie mam pojęcia co źle zrobiłem, a jednak zadnej wiadoomości nie odbiera co do niego wysyłam...


Wyślij cały projekt na rapidshare.de lub crrk @ o2.pl ;)

Masz w kodzie (pod koniec logowania gg):WSAAsyncSelect(sock,okno,MESSAGE_NA_JAKI_CHCESZ_OTRZYMYWAC_DANE,FD_READ);?
Użytkownik Cyrkiel edytował ten post 22 sierpień 2005, 21:47


Masz w kodzie (pod koniec logowania gg):WSAAsyncSelect(sock,okno,MESSAGE_NA_JAKI_CHCESZ_OTRZYMYWAC_DANE,FD_READ);?


Nie przepraszaj, chętnie odpowiem na Twoje pytania :Pchar* buforek = new char[256]; GetWindowText(edit,buforek,256); MessageBox(0,buforek,"",64);Masz procedurę sprawdzania przycisku?
Użytkownik Cyrkiel edytował ten post 24 sierpień 2005, 01:07


Masz procedurę sprawdzania przycisku?


Wklej tu funkcje tworzenia EDITa, lub wyślij gdzies cały project i podaj link ;)

CreateWindow("edit",NULL, WS_CHILD | WS_VISIBLE,0,211,400,120,uchwyt,(HMENU)101,hInstance,NULL);

To jest ta funkcja, mam ją w głównej funkcji WinMain

A mam pytanie, nie na temat, czy można zablokować jakiś port -aby nie można było przez niego odbierać ani wysyłać?
Użytkownik sh4rk edytował ten post 24 sierpień 2005, 20:39

1. Za wiele mi to nie mówi, mam to samo w jednym programiku i nie mam takiego efektu :P Wyślij projekt na rapidshare.de ;)
2. Coś w stylu firewall-a? Jeszcze tego nie rozpracowałem, ale widziałem jakies projekty na sf.net. Można zrobić coś w stylu zbindowania portu i odrzucania nadchodzącego połączenia :)

Nie wiem czy zauważyłeś - wysłałem Ci maila z tym projektem, jakbyś mógł zobaczyć i powiedzieć mi jak zrobić z tym enterem....

widze żę zapomniałęś albo coś to więc dalje tutaj bardzo prosty kod, a jakby ktoś mógł mi go przerobić aby za pomocą entera (kiedy mam aktywny jakiś przyciska, albo edita) pokazywał mi się messagebox z napisaem "nacisnałeś eneter w edice"

#include  < windows.h > static TCHAR nazwa[]=TEXT("OKIENKO"); LRESULT CALLBACK ProcOkna(HWND uchwyt,UINT komunikat,WPARAM wParam,LPARAM lParam) {  switch (komunikat)  {        case WM_CREATE:        //        break;        case WM_DESTROY:        PostQuitMessage(0);        break;        case WM_KEYDOWN:            switch (wParam)            {            case VK_ESCAPE:            PostQuitMessage(0);            break;            }        break; default: return (DefWindowProc(uchwyt,komunikat,wParam,lParam)); } return(0L); } int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { WNDCLASS klasaokna; HWND uchwyt; klasaokna.style=CS_HREDRAW | CS_VREDRAW; klasaokna.lpfnWndProc=ProcOkna; klasaokna.cbClsExtra = 0; klasaokna.cbWndExtra = 0; klasaokna.hInstance = hInstance; klasaokna.hIcon = NULL; klasaokna.hCursor = LoadCursor(NULL, IDC_ARROW); klasaokna.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); klasaokna.lpszMenuName = NULL; klasaokna.lpszClassName = nazwa; if(RegisterClass(&klasaokna)==0) return FALSE; uchwyt=CreateWindow(nazwa,"program w WINAPI",WS_OVERLAPPEDWINDOW,        100, 100, 400, 300,NULL, NULL, hInstance, NULL); CreateWindow("edit",NULL, WS_CHILD | WS_VISIBLE,0,50,125,15,uchwyt,(HMENU)100,hInstance,NULL); if(uchwyt==NULL) return FALSE; ShowWindow(uchwyt,SW_SHOW); UpdateWindow(uchwyt); MSG komunikat; while(GetMessage(&komunikat, NULL, 0, 0)) { TranslateMessage(&komunikat); DispatchMessage(&komunikat); } return komunikat.wParam; }
Użytkownik sh4rk edytował ten post 04 wrzesień 2005, 07:28
Ehh.. ;)
Ja też mam swoje małe przejścia GG, mianowicie nie mogę się połączyć z tym głupim serverem :D I to nie tylko z własnego programu, ale i nawet z Telneta :D

I nie mam pojęcia dlaczego, ale to jest dziwne :D Ale bynajmniej nie płaczę z tego powodu - bo to akurat prosty problem do szybkiego rozwalenia ;)

Pozdrawiam.

//EDIT
6 minut później... ;)
Błędem oczywiście było złe zrozumienie dokumentu opisującego protokół GG; łączyłem się na appmsg.gadu-gadu.pl na 8074 zamiast na 80 ;D

//EDIT2
Ej, niektórzy tu już robili z protokołem GG, to niech mi ktoś powie, dlaczego jak się połączę na HTTP na appmsg.gadu-gadu.pl to zamiast normalnych odpowiedzi dostaję odpowiedzi IISa w HTML o tym, że bad request jest, itp.?

//EDIT3
HTTP/1.1 404 Object Not Found Server: Microsoft-IIS/5.0 Date: Sun, 04 Sep 2005 08:12:39 GMT Content-Type: text/html Content-Length: 111 <html><head><title>Site Not Found</title></head> <body>No web site is configured at this address.</body></html>Co, ja głupi jestem czy co? Dobrze sformatowane zapytanie a tu taka reakcja... ktoś mnie oświeci...
Użytkownik TeMPOraL edytował ten post 04 wrzesień 2005, 09:06

Takie zapytanie dałem w delphi, ale w dev-cpp nie działa :(char q[] = "GET /appsvc/appmsg4.asp?version=36 HTTP/1.1\r\nHost: appmsg.gadu-gadu.pl\r\nAccept: */*\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.00; Windows 98)\r\nPragma: no-cache\r\nCache-Control: no-cache\r\nConnection: close\r\n\r\n";

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