winsock "invalid argument" 监听错误

winsock "invalid argument" error on listen

我试图制作一个简单的客户端 - 服务器通信应用程序,但我遇到了一个问题 - 我在监听时收到错误 10022(无效参数)。

WSADATA wsaData;
int iResult;
sockaddr_in addr;
SOCKET sock, client;
addr.sin_family = AF_INET;
addr.sin_port = htons( 25565 );
addr.sin_addr.S_un.S_addr = inet_addr( "127.0.0.1" );

iResult = WSAStartup( MAKEWORD( 2, 2 ), &wsaData );

if( iResult )
{
    std::cout << ( WSAGetLastError( ) );
    _getch( );
}

sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );

if( sock == INVALID_SOCKET )
{
    std::cout << ( WSAGetLastError( ) );
    _getch( );
}

iResult = listen( sock, SOMAXCONN );

if( iResult )
{
    std::cout << ( WSAGetLastError( ) );
    _getch( );
}

listen 之前,您需要 bind 将套接字连接到将被监听的端口。

看起来您已经构建了包含 bind 所需信息的地址结构,因此调用 bind(sock, &addr, sizeof(addr)) 并在调用 listen 之前执行适当的错误检查。

Documentation for bind

答案在listen() documentation:

WSAEINVAL

The socket has not been bound with bind.

您需要 bind() 插座才能 listen() 它。