zoukankan      html  css  js  c++  java
  • 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描述符并不遵循使用未使用的描述符的最小值的规律,而是随机分配的一个整数值,具体的分配规律有待探究,若有熟悉朋友亦可帮忙解答。

  • 相关阅读:
    Window7下手动编译最新版的PCL库
    C和C++中的异常处理
    队列之卡片游戏
    C/C++笔记
    最真的梦——文/林清玄
    库函数与系统调用的区别
    hdu2653之BFS
    使用ffmpeg+crtmpserver搭建文件的伪直播
    ZOJ3705:Applications
    c_c++基础问题(平时读书时笔记)
  • 原文地址:https://www.cnblogs.com/zhouLee/p/5110361.html
Copyright © 2011-2022 走看看