Хочу написать простенький TCP сервер на C++, чтобы он в одном потоке слушал подключения к нему, а потом под каждого нового клиента выделял новый поток.
Я написал подобный код:
void startServer() {
int wsaStatus;
WSADATA WSAData;
wsaStatus = WSAStartup(MAKEWORD(2, 0), &WSAData);
if (wsaStatus != NO_ERROR) {
cout << "WSA Startup failed with error : " << wsaStatus;
}
SOCKET sock;
SOCKADDR_IN sin;
sin.sin_addr.s_addr = htonl(INADDR_ANY);
sin.sin_family = AF_INET;
sin.sin_port = htons(1234);
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock == INVALID_SOCKET) {
std::cout << "INVALID SOCKET " << WSAGetLastError();
WSACleanup();
}
bind(sock, (SOCKADDR*)&sin, sizeof(sin));
listen(sock, 1000);
while (true)
{
int sizeof_sin = sizeof(sin);
sock = accept(sock, (SOCKADDR*)&sin, &sizeof_sin);
thread clientThread(serveClient, sock); //под каждого нового клиента выделяю новый поток
clientThread.detach();
cout << "CONNECTION ESTABLISHED!" << endl;
}
WSACleanup();
}
А вот код функции которая обрабатывает каждого клиента:
void serveClient(SOCKET socket) {
char buffer[255];
if (socket != INVALID_SOCKET)
{
recv(socket, buffer, sizeof(buffer), 0);
closesocket(socket);
std::cout << buffer << std::endl;
}
else {
closesocket(socket);
}
}
Но по какой то причине функция accept() не хочет задерживать код, до того времени как подключиться клиент, а просто проигрывается в цикле без дожидания клиента (
Где я допустил ошибку ?