Skocz do zawartości

sockety


Jaklub

Rekomendowane odpowiedzi

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

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

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ę
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...