【问题标题】:WSAEventselect Error: 10038WSAEventselect 错误:10038
【发布时间】:2011-02-13 02:50:45
【问题描述】:

我一直在尝试解决这个问题,但我需要帮助,因为我没有想法。我的 WSAEventselect 函数返回错误号 10038。

代码:

        // Error checking....
        if(netEvent.iErrorCode[FD_ACCEPT_BIT] != 0)
        {
            int temp1 = WSAGetLastError();
            emit ClientErrorSignal();
            return;
        }

        // Initializing socket
        if((newClient = accept(this->info->socket, NULL, NULL)) == INVALID_SOCKET)
        {
            int temp2 = WSAGetLastError();
            emit ClientErrorSignal();
            return;
        }

        // This is where the error occurs
        if(WSAEventSelect(newClient, &this->info->event, FD_READ|FD_CLOSE) == SOCKET_ERROR)
        {
            int temp3 = WSAGetLastError();
            emit ClientErrorSignal();
            return;
        }

this->info 是传递给线程的结构。

typedef struct {
    SOCKET socket;
    int size;
    bool isTcp;
    WSAEVENT event;
} SINFO, *PSINFO;

【问题讨论】:

    标签: c++ sockets winsock


    【解决方案1】:

    根据the Winsock error reference,这是一个WSAENOTSOCK 错误,这意味着您正在尝试使用无效的套接字句柄执行某些操作。如果没有更多关于代码中错误发生位置的信息,我认为我不能提供比这更多的建议,但我建议检查以确保您正确创建了套接字(可能是对 accept 的调用在未初始化的套接字上是罪魁祸首?)

    【讨论】:

    • accept 本身应该初始化newClient 套接字。这就是我感到困惑的地方,因为 accept 没有抛出任何错误。
    【解决方案2】:

    这可能与您的问题有关,也可能不相关,但您传递给WSAEventSelect 的第二个参数是WSAEVENT*,而函数需要WSAEVENT。直接传递句柄,而不是它的地址:

    WSAEventSelect(..., info->event, ...);
    

    【讨论】:

    • 你说的很对。我怎么会这么瞎……我需要睡觉……谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    相关资源
    最近更新 更多