Jaklub Opublikowano 25 Lipca 2009 Udostępnij Opublikowano 25 Lipca 2009 próbuję zaprogramować proste lobby do gry przez sieć. używam HawkNL. mam takie kody: próba utworzenia serwera: int ServerCreate() { serversock = nlOpen(24000, type); // 1 argument port, 2 typ socketa do utworzenia if(serversock == NL_INVALID) { NetErrorMessageBack(); // rysowanie błędu w tle allegro_message("Failed to create session."); // okienko windowsowe return 0; } if(!nlListen(serversock)) { nlClose(serversock); NetErrorMessageBack(); allegro_message("Failed to listen for connections."); return 0; } return 1; } próba dołączenia do serwera: int JoinAttempt() { NLbyte server[] = "127.0.0.1:24000"; clientsock = nlOpen(0, type); if(clientsock == NL_INVALID) { nlClose(clientsock); // zamyka socketa NetErrorMessageBack(); allegro_message("Error encountered!"); return 0; } nlStringToAddr(server, &addr); // zmienia string na adres IP if(!nlConnect(clientsock, &addr)) // próba dołączenia do gry { nlClose(clientsock); NetErrorMessageBack(); allegro_message("Failed to join the session!"); return 0; } return 1; } akceptowanie połączeń (tylko u serwera) NLsocket newsock = nlAcceptConnection(serversock); if(newsock != NL_INVALID) { temp[4]=50; NLaddress addr; nlGetRemoteAddr(newsock, &addr); client[clientnum] = newsock; //printf("Client %d connected from %s\n", clientnum, nlAddrToString(&addr, string)); clientnum++; } else { if(nlGetError() == NL_SYSTEM_ERROR) { NetErrorMessageBack(); allegro_message("Error encountered!"); quit_var=-1; } } } sprawdzanie, czy klienci się nie rozłączyli (też tylko u serwera) for(temp[1]=0; temp[1]<clientnum; temp[1]++) { int readlen; //while((readlen = nlRead(s[i], buffer, sizeof(buffer))) > 0) { //} readlen = nlRead(client[temp[1]],buffer,sizeof(buffer)); if(readlen == NL_INVALID) { NLenum err = nlGetError(); if( err == NL_MESSAGE_END || err == NL_SOCK_DISCONNECT) { nlClose(client[temp[1]]); clientnum--; } } } problem w tym, że to wszystko nie działa dobrze. bez sprawdzania rozłączeń klientów za pierwszym razem wszystko działa dobrze, tylko gdy wyłączę grę i spróbuję jeszcze raz zahostować, gra zachowuje się tak, jakby nikt nie próbował się dołączyć (a próbuje). z włączonym sprawdzaniem rozłączeń klientów jest tak samo, ale kiedy klient się rozłączy i inny próbuje się połączyć, też nie może. gdzie może być problem? w ogóle znacie jakieś dobre tutoriale o obsłudze socketów? pomocy ps. kiedy próbuję zamknąć sockety przy wyłączaniu gry, mam errory "Socket not valid". Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
tomekk1410 Opublikowano 25 Lipca 2009 Udostępnij Opublikowano 25 Lipca 2009 http://firsthost.nazwa.pl/wordpress/socket-tutorial/ - Sprawdź może ci pomoże. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Jaklub Opublikowano 27 Lipca 2009 Autor Udostępnij Opublikowano 27 Lipca 2009 to może inne pytanie: jak i kiedy zamykać sockety, żeby po ponownym włączeniu aplikacji można było je spokojnie, jeszcze raz, bez błędów otworzyć? to na razie mój jedyny problem przy robieniu gry przez sieć (nawet z przesyłaniem wiadomości sobie poradziłem). Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Will Opublikowano 27 Lipca 2009 Udostępnij Opublikowano 27 Lipca 2009 Co prawda ostatnio bawiłem się w to z rok temu ale bodajże przy disconnect'cie miałem shutdown(socket,SD_BOTH); closesocket(socket); socket=invalid_socket); Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Jaklub Opublikowano 27 Lipca 2009 Autor Udostępnij Opublikowano 27 Lipca 2009 zdaje się, że problem rozwiązałem, ale tematu oczywiście nie zamykam - inne błędy mogą jeszcze się pojawić (ale mam nadzieję, że nie). dzięki za pomoc Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się