winsock i niezrozumiałe dla mnie zachowanie funkcji accept

0

Witam. Właśnie udało mi się napisać klient oraz serwer oparte na winsock. Zaimplementowałem przesyłanie pojedynczych buforów oraz plików w obie strony. Wszystko działa OK, ale chciałem to opakować w klasę. Stworzyłem więc klasę, której obiekt może być zarówno klientem, jak i serwerem. Jeśli ma być serwerem to wywołuję metodę InitializeServer(int port), która inicjalizuje wszystkie niezbędne zmienne i wywołuje funkcje:

  1. socket (dla stworzenia gniazda)
  2. bind
  3. listen
  4. accept
    Wywołanie accept:
 client= accept(m_socket, (sockaddr*)&saclient, &length);
if(client==INVALID_SOCKET)
{
		printf("Invalid client socket, connection failed \n");
		closesocket(m_socket);
		return;
}

Jeśli wykonuję wszystkie te czynności bez opakowywania w klasę - accept zachowuje się prawidłowo i oczekuje na połączenie z klientem. Natomiast przy wywołaniu jej z poziomu mojej klasy od razu zwraca INVALID_SOCKET i program kończy działanie. Próbowałem zapętlić wywołanie w while(true), ale wtedy również nie wykrywa połączenia z klientem (wywołania connect po stronie klienta). Być może niezbyt dobrze rozumiem działanie funkcji accept i listen. Może to listen jest funkcją która wstrzymuje swoje wywołanie do momentu wykrycia połączenia? W takim razie dlaczego nie zwraca błedu? Sprawdziłem kod bardzo dokładnie i jedyną zmianą jaką wprowadziłem jest opakowanie w klasę (wszystkie zmienne wrzuciłem do private, metody do public), nic poza tym.

0

Po wywołaniu socket() wrzuciłem Sleep(1000) i teraz działa ok - serwer grzecznie czeka na połączenie z klientem. Ktoś mi wytłumaczy dlaczego to pomogło? Ja już zgłupiałem.

0

Pokaż kod tej klasy, bo bez tego trudno coś sensownego napisać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1