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".