Stay Hungry , Stay Foolish

君子生非异也,善假于物也

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

在使用WSAEventSelect的套接字模型中,遇到了WSAEventSelect返回10038的错误,在定位解决的过程中,简单记录一些定位解决的手段摘要。

使用windows的错误帮助信息,使用命令“net helpmsd 10038”,获取10038错误码对应的具体错误信息。

image

通过单步调试,发现WSAEventSelect中第一个参数SOCKET描述符值为0,所以WSAEventSelect函数调用发送10038错误。

具体原因在如下的判断和赋值操作中,没有将赋值过程使用括号,因为等于条件比较优先级高于赋值运算,导致accept获取到的SOCKET描述符值总是为0。

SOCKET acceptSck;
if((acceptSck = accept(socketArray[event - WSA_WAIT_EVENT_0]->sckt, NULL, NULL)) == INVALID_SOCKET)
{
    printf("accept failed with error %d\n", WSAGetLastError());
    return FALSE;
}

 

在windows下,获取标准输入,输出,错误的文件描述符编号:

printf("stdin fileno [%d], stdout fileno [%d], stderr fileno [%d]\n", fileno(stdin), fileno(stdout), fileno(stderr));

image

可以看出标准输入文件描述符为为0,标准输出为1,错误输出为2。但新创建的SOCKET描述符并不遵循使用未使用的描述符的最小值的规律,而是随机分配的一个整数值,具体的分配规律有待探究,若有熟悉朋友亦可帮忙解答。

posted on 2016-01-07 16:39  octocat  阅读(237)  评论(0编辑  收藏  举报