Ĺadny brzuch
jak dobierać wiadomości GG w c++/api [...]
edit:
1.KOD ZOSTAŁ USUNIĘTY
2.problem został opisany na dole
Użytkownik dgf45 edytował ten post 23 kwiecień 2006, 16:06
Umiesz żyć bez okienka ? Zrób to w konsoli.
Po drugie, po co ci ten switch, skoro i tak w nim nic nie robisz (case'y są puste).
Po trzecie, zakładasz że wszystko jest ok, i nie sprawdzasz żadnych błędów.
Po czwarte, logujesz sie, itp, a potem odbierasz od razu do recv_msg :P
Widze stosujesz sie do prawa dokumentacji które brzmi : Nikt nie czyta jej dokładnie. W opisie protokołu jest wyraźnie napisane, że po zalogowaniu otzrymujemy np pakiety z dostępnymi osobami i różne inne, a ty od razu czekasz na wiadomość. Przecierz jeżeli przyjdzie inny pakiet, to twój program najprawdopodbniej sie sypnie. Pisałem ci już o buforowaniu (for kopiujący z tablicy char do struktury).
Pozatym nie pisz PMek żeby ktoś zobaczył twój topic (jak będe miał czas i ochote to zabacze, a jak nie to nawet PMka mnie nie przekona :P), ani nie zakładaj 3 tematu o tym samym.
HINT: najpierw z bufora (do którego będziesz odbierał dane) sprawdz numer pakietu (pierwsze 4 bajty) a potem daj sobie
switch (mój_numer_pakietu) { case GG_WELCOME: .. break; case GG_RECVMSG: //obsługa wiadomości break; .... ... }
jako mój_numer_oakietu mam wstawić, np.switch (gg_recv_msg) { case GG_WELCOME: .. break; case GG_RECVMSG: //obsługa wiadomości break; .... ... }
//e.. chyba nie, co mam wpisać w miejsce mój_numer_poakietu? jaki numer?
Użytkownik dgf45 edytował ten post 21 kwiecień 2006, 13:02
Wiesz chociarz co ten switch robi ?
Jak nie, to poćwicz c++.
char buf[2048]; char p*; recv(soscket,buf,2048,0); int pakiet; p = (char*)&pakiet; for(int c=0;c<4;c++) p[c] = buf[c]; switch (pakiet){ case GG_WELCOME: break; }
Użytkownik Antrykot edytował ten post 21 kwiecień 2006, 13:00
//edit: miałem char p* zamiast char *p :P
Użytkownik dgf45 edytował ten post 09 maj 2006, 14:08
char *p; zamiast char p*; ;)
thx. pomogło ale teraz problem dotyczy fragmentu case gg_welcome:
161 C:\Documents and Settings\norbert\Pulpit\BezNazwy1.cpp expected primary-expression before ':' token poza tym co mam wpisać do tego case gg_welcome, i gdzie podawać instr, jak ktoś przysyła wiadomość, tzn. jak ją odebrać. bo struktór jest wiele, a nie można jakiś pomylić, więc sprzydałoby się żaby dla każdej wykonywał program inne zadanie, przykład:
struct tytul {
int typ, size;
char desc[2000];
};
a np.
struct tytsul {
int tsyp, sizse;
char dedssc[2000];
}; który ma już inną budowę i chyba dla każdego z nich wykonywalo by się coś innego
Przecież gg_welcome to u Ciebie nazwa struktury, a nie numer pakietu - dlatego nie działa.
Co do reszty Twojej wypowiedzi to trochę nie jestem pewien co miałeś na myśli. ;)
Zdefiniuj sobie struktury tak jak jest to w opisie protkołu podane, gdy coś przyjdzie to pobieraj tyle ile ma struktura gg_header, sprawdzaj w niej typ pakietu i odbieraj do odpowiedniej struktury.
i gdzie podawać instr, jak ktoś przysyła wiadomość, tzn. jak ją odebrać. bo struktór jest wiele, a nie można jakiś pomylić, więc sprzydałoby się żaby dla każdej wykonywał program inne zadanie, przykład:
struct tytul {
int typ, size;
char desc[2000];
};
a np.
struct tytsul {
int tsyp, sizse;
char dedssc[2000];
}; który ma już inną budowę i chyba dla każdego z nich wykonywalo by się coś innego
1. nie wiem do czego ma służyć switch
2.co to jest ten pakiet
1. nie wiem do czego ma służyć switch
2.co to jest ten pakiet
gdy coś przyjdzie to pobieraj tyle ile ma struktura gg_header, sprawdzaj w niej typ pakietu i odbieraj do odpowiedniej struktury.
Przecież nigdzie nie przypisujesz żadnej wartości do zmiennej pakiet, więc nie oczekuj, że będzie w niej to co chcesz.
Użytkownik Chmurek edytował ten post 22 kwiecień 2006, 19:52
to jak mam przypisać?
lub
jak mogę odebrać wiadomość i wyświetlić ja printf()
Użytkownik dgf45 edytował ten post 22 kwiecień 2006, 19:54
Przyjmując, że gg_header miałbyś zdefiniowane tak jak w opisie protokołu to
gg_header naglowek; recv(s, &naglowek, sizeof(gg_header), 0);
I wtedy masz numer pakietu w naglowek.type.
czy muszę zastosować na początku jakąś pętlę? Wydaje się, że tak, mam to zorbione tak:
gg_header naglowek; recv(s,(char*) &naglowek,sizeof(gg_header), 0); cout << "Otrzymano pakiet typu:" << naglowek.typ << "\n"; switch (naglowek.typ){ case 0x0001:{ gg_welcome welcome; recv(s,(char*) &welcome,sizeof(gg_welcome),0); printf("seed: %d\n",welcome.seed); gg_login log = {0x15,sizeof(gg_login)-8,9115671,gg_login_hash("123456",welcome.seed),2,0x20, 0,0,0,0,0,256,0xbe}; send(s,(char*)&log,sizeof(log),0); break; } case 0x0002: { gg_new_status loginstatus; recv(s,(char*) &loginstatus,sizeof(gg_new_status),0); printf("status logowania: %d\n",loginstatus); char* statusek = "super statusik "; set_status stat = {2,4+strlen(statusek)}; for (int i=0; i<strlen(statusek); i++) stat.desc[i] = statusek[i]; stat.status = 4; send(s,(char*) &stat,12+strlen(statusek),0); break; } case 0x000a:{ gg_recv_msg wiadomosc; recv(s,(char*) &wiadomosc,sizeof(gg_recv_msg),0); cout << "otrzymano wiadomosc od\n" << wiadomosc.sender <<"\n" << "o tresci\n" << wiadomosc.messages; break; } } jak usunę break po każdy case to jeszcze to jako tako działa (loguje się i ustawia status), ale jak jest tak jak teraz to niestety niiiie za bardzo. Co trzeba tam wstawić żeby to działało poprawnie? struktury mam zadefiniowane takie jak w opisie protokołu, chyba, że te które wysyłam, to dodałem na początek pola typ, size.
Ostatecznie chyba brakuje jakiejś pętli, ale jakiej?
jak będziecie mieć kiedyś czas, to odpiszcie
Użytkownik dgf45 edytował ten post 23 kwiecień 2006, 15:56
Możesz dać to wszystko do nieskończonej pętli, a poza tym trochę mało sensowne jest robienie tego na gniazdku blokującym.
Poza tym zauważ, że jeśli dojdzie coś innego to nie zostanie odebrane z gniazdka przy takim kodzie.
Użytkownik Chmurek edytował ten post 23 kwiecień 2006, 22:16
a coś innego oprócz pętli istnieje? pętla trochę paraliżuje program cały
http://forum.ks-eksp...ndpost&p=599789
tu mam taką metodę z winapi.org dot. komunikatyów i coś z FD-READ i chyba są tylko te dwie metody
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
edit:
1.KOD ZOSTAŁ USUNIĘTY
2.problem został opisany na dole
Użytkownik dgf45 edytował ten post 23 kwiecień 2006, 16:06
Umiesz żyć bez okienka ? Zrób to w konsoli.
Po drugie, po co ci ten switch, skoro i tak w nim nic nie robisz (case'y są puste).
Po trzecie, zakładasz że wszystko jest ok, i nie sprawdzasz żadnych błędów.
Po czwarte, logujesz sie, itp, a potem odbierasz od razu do recv_msg :P
Widze stosujesz sie do prawa dokumentacji które brzmi : Nikt nie czyta jej dokładnie. W opisie protokołu jest wyraźnie napisane, że po zalogowaniu otzrymujemy np pakiety z dostępnymi osobami i różne inne, a ty od razu czekasz na wiadomość. Przecierz jeżeli przyjdzie inny pakiet, to twój program najprawdopodbniej sie sypnie. Pisałem ci już o buforowaniu (for kopiujący z tablicy char do struktury).
Pozatym nie pisz PMek żeby ktoś zobaczył twój topic (jak będe miał czas i ochote to zabacze, a jak nie to nawet PMka mnie nie przekona :P), ani nie zakładaj 3 tematu o tym samym.
HINT: najpierw z bufora (do którego będziesz odbierał dane) sprawdz numer pakietu (pierwsze 4 bajty) a potem daj sobie
switch (mój_numer_pakietu) { case GG_WELCOME: .. break; case GG_RECVMSG: //obsługa wiadomości break; .... ... }
jako mój_numer_oakietu mam wstawić, np.switch (gg_recv_msg) { case GG_WELCOME: .. break; case GG_RECVMSG: //obsługa wiadomości break; .... ... }
//e.. chyba nie, co mam wpisać w miejsce mój_numer_poakietu? jaki numer?
Użytkownik dgf45 edytował ten post 21 kwiecień 2006, 13:02
Wiesz chociarz co ten switch robi ?
Jak nie, to poćwicz c++.
char buf[2048]; char p*; recv(soscket,buf,2048,0); int pakiet; p = (char*)&pakiet; for(int c=0;c<4;c++) p[c] = buf[c]; switch (pakiet){ case GG_WELCOME: break; }
Użytkownik Antrykot edytował ten post 21 kwiecień 2006, 13:00
//edit: miałem char p* zamiast char *p :P
Użytkownik dgf45 edytował ten post 09 maj 2006, 14:08
char *p; zamiast char p*; ;)
thx. pomogło ale teraz problem dotyczy fragmentu case gg_welcome:
161 C:\Documents and Settings\norbert\Pulpit\BezNazwy1.cpp expected primary-expression before ':' token poza tym co mam wpisać do tego case gg_welcome, i gdzie podawać instr, jak ktoś przysyła wiadomość, tzn. jak ją odebrać. bo struktór jest wiele, a nie można jakiś pomylić, więc sprzydałoby się żaby dla każdej wykonywał program inne zadanie, przykład:
struct tytul {
int typ, size;
char desc[2000];
};
a np.
struct tytsul {
int tsyp, sizse;
char dedssc[2000];
}; który ma już inną budowę i chyba dla każdego z nich wykonywalo by się coś innego
Przecież gg_welcome to u Ciebie nazwa struktury, a nie numer pakietu - dlatego nie działa.
Co do reszty Twojej wypowiedzi to trochę nie jestem pewien co miałeś na myśli. ;)
Zdefiniuj sobie struktury tak jak jest to w opisie protkołu podane, gdy coś przyjdzie to pobieraj tyle ile ma struktura gg_header, sprawdzaj w niej typ pakietu i odbieraj do odpowiedniej struktury.
i gdzie podawać instr, jak ktoś przysyła wiadomość, tzn. jak ją odebrać. bo struktór jest wiele, a nie można jakiś pomylić, więc sprzydałoby się żaby dla każdej wykonywał program inne zadanie, przykład:
struct tytul {
int typ, size;
char desc[2000];
};
a np.
struct tytsul {
int tsyp, sizse;
char dedssc[2000];
}; który ma już inną budowę i chyba dla każdego z nich wykonywalo by się coś innego
1. nie wiem do czego ma służyć switch
2.co to jest ten pakiet
1. nie wiem do czego ma służyć switch
2.co to jest ten pakiet
gdy coś przyjdzie to pobieraj tyle ile ma struktura gg_header, sprawdzaj w niej typ pakietu i odbieraj do odpowiedniej struktury.
Przecież nigdzie nie przypisujesz żadnej wartości do zmiennej pakiet, więc nie oczekuj, że będzie w niej to co chcesz.
Użytkownik Chmurek edytował ten post 22 kwiecień 2006, 19:52
to jak mam przypisać?
lub
jak mogę odebrać wiadomość i wyświetlić ja printf()
Użytkownik dgf45 edytował ten post 22 kwiecień 2006, 19:54
Przyjmując, że gg_header miałbyś zdefiniowane tak jak w opisie protokołu to
gg_header naglowek; recv(s, &naglowek, sizeof(gg_header), 0);
I wtedy masz numer pakietu w naglowek.type.
czy muszę zastosować na początku jakąś pętlę? Wydaje się, że tak, mam to zorbione tak:
gg_header naglowek; recv(s,(char*) &naglowek,sizeof(gg_header), 0); cout << "Otrzymano pakiet typu:" << naglowek.typ << "\n"; switch (naglowek.typ){ case 0x0001:{ gg_welcome welcome; recv(s,(char*) &welcome,sizeof(gg_welcome),0); printf("seed: %d\n",welcome.seed); gg_login log = {0x15,sizeof(gg_login)-8,9115671,gg_login_hash("123456",welcome.seed),2,0x20, 0,0,0,0,0,256,0xbe}; send(s,(char*)&log,sizeof(log),0); break; } case 0x0002: { gg_new_status loginstatus; recv(s,(char*) &loginstatus,sizeof(gg_new_status),0); printf("status logowania: %d\n",loginstatus); char* statusek = "super statusik "; set_status stat = {2,4+strlen(statusek)}; for (int i=0; i<strlen(statusek); i++) stat.desc[i] = statusek[i]; stat.status = 4; send(s,(char*) &stat,12+strlen(statusek),0); break; } case 0x000a:{ gg_recv_msg wiadomosc; recv(s,(char*) &wiadomosc,sizeof(gg_recv_msg),0); cout << "otrzymano wiadomosc od\n" << wiadomosc.sender <<"\n" << "o tresci\n" << wiadomosc.messages; break; } } jak usunę break po każdy case to jeszcze to jako tako działa (loguje się i ustawia status), ale jak jest tak jak teraz to niestety niiiie za bardzo. Co trzeba tam wstawić żeby to działało poprawnie? struktury mam zadefiniowane takie jak w opisie protokołu, chyba, że te które wysyłam, to dodałem na początek pola typ, size.
Ostatecznie chyba brakuje jakiejś pętli, ale jakiej?
jak będziecie mieć kiedyś czas, to odpiszcie
Użytkownik dgf45 edytował ten post 23 kwiecień 2006, 15:56
Możesz dać to wszystko do nieskończonej pętli, a poza tym trochę mało sensowne jest robienie tego na gniazdku blokującym.
Poza tym zauważ, że jeśli dojdzie coś innego to nie zostanie odebrane z gniazdka przy takim kodzie.
Użytkownik Chmurek edytował ten post 23 kwiecień 2006, 22:16
a coś innego oprócz pętli istnieje? pętla trochę paraliżuje program cały
http://forum.ks-eksp...ndpost&p=599789
tu mam taką metodę z winapi.org dot. komunikatyów i coś z FD-READ i chyba są tylko te dwie metody