在使用WSAEventSelect的套接字模型中,遇到了WSAEventSelect返回10038的错误,在定位解决的过程中,简单记录一些定位解决的手段摘要。
使用windows的错误帮助信息,使用命令“net helpmsd 10038”,获取10038错误码对应的具体错误信息。
通过单步调试,发现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));
可以看出标准输入文件描述符为为0,标准输出为1,错误输出为2。但新创建的SOCKET描述符并不遵循使用未使用的描述符的最小值的规律,而是随机分配的一个整数值,具体的分配规律有待探究,若有熟悉朋友亦可帮忙解答。