Autor Wątek: SDL_Net - crash  (Przeczytany 1104 razy)

Offline Attil

  • Użytkownik

# Lipiec 19, 2009, 21:45:42
Witam.
Mam problem - Pisze serwer używając SDL_Net, który crashuje się podczas wywoływania SDLNet_TCP_Recv(), a przynajmniej tak wynika z obserwacji zachowania debuggera... Co najzabawniejsze, SDLNet_TCP_Recv() jest w pętli i czasami 'udaje się' złapać pierwszy znak, jaki wysyłam. Do wysyłania pakietów używam telnetu. Warto dodać, że cała obsługa tego socketa(poza tworzeniem) jest w wątku pobocznym. Jak można rozwiązać taki problem?
Miejsce, w którym otrzymuje Access Violation:
Kod: (cpp) [Zaznacz]
std::string received;
char* buffer = new char;
received = "";
do
{
if(SDLNet_TCP_Recv(params->serv->clients[params->socknumber]/*TCPsocket, ktorego w tej chwili obsługuje*/, buffer, 1) < 1)
{
/*fs.open("log.txt");
fs << SDL_GetError();
fs.close();*/
}
else
{
received += std::string(buffer, 1);
}
} while (true);
Test, po którym program się crashuje wygląda tak:
1. Włączam server
2. Włączam telnet
3. o localhost 9999
4. Wg debuggera program właśnie znajduje sie przy SDLNet_TCP_Recv() - jest to normalne, w dokumentacji jest napisane, że to funkcja blokująca
5. Wpisuje dowolny znak w telnecie
6. Program sie crashuje przy SDLNet_TCP_Recv(), jednak podgląd wartości w debuggerze pokazuje, że poprzedni znak został 'poprawnie' wpisany do received

Edit: Zapomniałem dodać, że przed wywołaniem SDLNet_TCP_Recv(), po którym nastąpi crash, zmienne maja 'losowe' wartosci, np. params->socknumber, który linijke temu miał poprawną wartość, teraz ma bardzo dziwną, a w powyższym kodzie, jak widać, nigdzie go nie zmieniam.
« Ostatnia zmiana: Lipiec 19, 2009, 22:48:27 wysłana przez Attil »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Attil

  • Użytkownik

# Lipiec 19, 2009, 22:57:53
Problem rozwiązany! ^^
Rozwiązanie dla potomnych:
'params' pobierałem z wątku głównego i przesyłałem jako void* do potomnego - jedyny znany mi sposób, aby używać metod i pól klasy w metodzie statycznej, która jest wymagana do stworzenia nowego wątku. Następnie po prostu tworzyłem nowy wskaźnik i przypisywalem do niego adres, który otrzymałem jako argument funkcji - BŁ¡D! Stworzyłem nowy obiekt params, a następnie przekopiowałem wszystkie pola poprzedniego do nowego. Wygląda na to, że po prostu przy następnym obrocie pętli wskaźnik tracił ważność.