Я делаю небольшой IRC-сервер, но столкнулся с проблемой; при попытке прослушивания сокета я получаю ошибку 10022 (недопустимый аргумент).
Ошибка также появляется в accept (), но это потому, что сокет не слушает (проблема, о которой я пишу).
Я не включил функцию accept, потому что считаю, что в этом нет необходимости и добавлял бы бессмысленный код.
#include <iostream>
#include <ws2tcpip.h>
#include <winsock2.h>
#include <thread>
#include <string>
#pragma comment(lib, "Ws2_32.lib")
#define maxConnections 10
class Server
{
struct sockaddr_storage their_addr;
struct addrinfo hints, *res;
struct addrinfo *servinfo;
int status;
SOCKET sock;
public:
void Start(const char *port);
};
void Server::Start(const char *port)
{
WSADATA WSAData;
if (WSAStartup(MAKEWORD(2, 0), &WSAData) != 0)
{
std::cout << "[ERROR]: " << GetLastError() << ".\n";
}
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
status = getaddrinfo(NULL, port, &hints, &res);
sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
if (sock == SOCKET_ERROR)
{
std::cout << "[ERROR]: " << WSAGetLastError() << "Bad Socket.\n";
}
bind(sock, res->ai_addr, res->ai_addrlen);
Ошибка:
if (listen(sock, maxConnections) == SOCKET_ERROR)
{
std::cout << "[ERROR]: " << WSAGetLastError() << " Listening Failed.\n";
}
В приведенном выше коде подробно описаны создание и привязка сокета, все из которых успешно (хотя и не обязательно правильно). Проблема может быть в создании сокета, включая NULL.
Спасибо :)
bind
, выглядят неправильно - вы должны быть привязаны к адресу и порту. Попробуйте проверить возврат ошибки из этого вызова. - person simonc   schedule 27.12.2013