• Windows Socket网络编程-2016.01.07


    在使用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
    ", WSAGetLastError());
        return FALSE;
    }

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

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

    image

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

  • 相关阅读:
    【Java】String和Date、Timestamp之间的转换
    pl/sql改为汉语窗口的办法
    MySql生成随机数
    ETL概念
    oracle数据库中序列使用讲解
    oracle中的merge into用法解析
    mysql实现自动更新时间戳
    3.6:Linux touch命令:修改文件的时间戳
    3.5:Linux rmdir命令:删除空目录
    3.4:Linux mkdir命令:创建目录(文件夹)
  • 原文地址:https://www.cnblogs.com/zhouLee/p/5110361.html
Copyright © 2020-2023  润新知