Я пытаюсь создать многопоточный сервер для школьного проекта, и я полагаюсь на аналогичный код, который я написал в прошлом, но по какой-то причине в функции open
он всегда переходит в if
заявление и вылетает. что мешает ему создать сокет?
#pragma comment(lib, "Ws2_32.lib")
#include <WinSock2.h>
#include <exception>
#include <iostream>
#include <string>
#include <numeric>
#include <deque>
#include <queue>
#include <mutex>
#include <condition_variable>
void accept();
void open();
void close();
void bindAndListen();
#ifdef _DEBUG
#include <stdio.h>
#define TRACE(msg, ...) printf(msg "\n", __VA_ARGS__);
#else
#define TRACE(msg, ...) printf(msg "\n", __VA_ARGS__);
#define TRACE(msg, ...)
#endif
static const unsigned short PORT = 8826;
static const unsigned int IFACE = 0;
SOCKET _socket;
void clientHandler(SOCKET client_socket);
void close();
int main()
{
open();
}
void bindAndListen()
{
struct sockaddr_in sa = { 0 };
sa.sin_port = htons(PORT);
sa.sin_family = AF_INET;
sa.sin_addr.s_addr = IFACE;
if (bind(_socket, (struct sockaddr*) & sa, sizeof(sa)) == SOCKET_ERROR)
throw std::exception(__FUNCTION__ " - bind");
TRACE("binded");
if (listen(_socket, SOMAXCONN) == SOCKET_ERROR)
throw std::exception(__FUNCTION__ " - listen");
TRACE("listening...");
}
void clientHandler(SOCKET client_socket)
{
std::cout << "hello";
}
void close()
{
TRACE(__FUNCTION__ " closing accepting socket");
try
{
closesocket(_socket);
}
catch (...) {}
}
void open()
{
_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (_socket == INVALID_SOCKET)
throw std::exception(__FUNCTION__ " - socket");
}
void accept()
{
SOCKET client_socket = accept(_socket, NULL, NULL);
if (client_socket == INVALID_SOCKET)
throw std::exception(__FUNCTION__);
TRACE("Client accepted !");
// create new thread for client and detach from it
std::thread tr(&clientHandler, _socket);
tr.detach();
}