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:
- socket (dla stworzenia gniazda)
- bind
- listen
- 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.