сокет всегда возвращает INVALID_SOCKET - PullRequest
1 голос
/ 07 мая 2020

Я пытаюсь создать многопоточный сервер для школьного проекта, и я полагаюсь на аналогичный код, который я написал в прошлом, но по какой-то причине в функции 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();
}

1 Ответ

1 голос
/ 07 мая 2020

Вы должны вызвать WSAGetLastError, чтобы получить фактический код ошибки, из-за которой был возвращен INVALID_SOCKET.

В этом случае, похоже, вы не вызываете WSAStartup , поэтому вы получаете WSANOTINITIALISED ошибка.

Вы должны вызвать WSAStartup перед использованием каких-либо функций Winsock.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...