• 网络编程_fd_set结构


    #define _CRT_SECURE_NO_WARNINGS
    #define  _WINSOCK_DEPRECATED_NO_WARNINGS
    //#define FD_SETSIZE 128 //fd_set默认为64。可以强制更改为128。可以fd_set转定义查看,fd_set中FD_SETSIZE指的是fd_set可以处理的socket个数(64即指的是63个客户端socktet加一个服务器socket)。
    #include
    #include
    #include
    #include//网络库。
    #pragma comment(lib,"Ws2_32.lib")//只有32位的。对应库。

    int main(void)
    {
        WORD wdVersion = MAKEWORD(2, 2);//传入MAKEWORD宏里,存入wdVersion里。
        //MAKEWORD:原理((WORD)(((BYTE)(((DWORD_PTR)(a))&0xff))| ((WORD)(((BYTE)(((DWORD_PTR)(b)) &0xff)))<<8))。
        WSADATA wdScokMsg;
        //LPWSADATA lpw = malloc(sizeof(WSADATA));

        //int a = *((char*)&wdVersion);
        //int b = *((char*)&wdVersion+1);
        //WSAStartup(wdVersion, lpw);

        int nRes = WSAStartup(wdVersion, &wdScokMsg);

        if (0 != nRes)
        {
            switch (nRes)
            {
            case WSASYSNOTREADY:
                printf("重启下电脑试试,或者检查网络库。\n");
                break;
            case WSAVERNOTSUPPORTED:
                printf("请更新网络库。\n");
                break;
            case WSAEINPROGRESS:
                printf("请重新启动软件。\n");
                break;
            case WSAEPROCLIM:
                printf("请尝试关掉不必要的软件,以为当前网络运行提供充足的资源。\n");
                break;
                /*case WSAEFAULT://参数问题。
                    break;*/

            }
        }
        //校验版本。
        if (2 != HIBYTE(wdScokMsg.wVersion) || 2 != LOBYTE(wdScokMsg.wVersion))
        {
            //说明版本不对。
            //清理网络库。
            WSACleanup();
            return 0;
        }

        SOCKET socketServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        //成功返回可用的socket。失败返回INVALID_SOCKET。
        //int a = WSAGetLastError();//检测最近的系统定义函数。
        if (INVALID_SOCKET == socketServer)
        {
            int a = WSAGetLastError();//检测最近的系统定义函数。值为10043,请求的协议还没有在系统中配置,或者没有它存在的迹象。 
            //创建失败。
            //清理网络库。
            WSACleanup();
            return 0;
        }
        //绑定地址与端口。
        struct sockaddr_in si;
        si.sin_family = AF_INET;
        si.sin_port = htons(12345);//端口号
        si.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
        if (SOCKET_ERROR == bind(socketServer, (const struct sockaddr*)&si, sizeof(si)))//失败返回SOCKET_ERROR。成功返回0。
        {
            //出错了,SOCKET_ERROR是一个int类型的-1。
            int a = WSAGetLastError();//检测最近的系统定义函数。值为10043,请求的协议还没有在系统中配置,或者没有它存在的迹象。 
            //释放
            closesocket(socketServer);
            //清理网络库。
            WSACleanup();
            return 0;
        }

        //监听。
        if (SOCKET_ERROR == listen(socketServer, SOMAXCONN))
        {
            //出错了,SOCKET_ERROR是一个int类型的-1。
            int a = WSAGetLastError();//检测最近的系统定义函数。值为10043,请求的协议还没有在系统中配置,或者没有它存在的迹象。 
            //释放
            closesocket(socketServer);
            //清理网络库。
            WSACleanup();
            return 0;
        }

        //定义一个装客户端socket的结构。四个操作fd_set参数宏:FD_ZERO,将集合清零;FD_SET:向集合中添加一个socket;FD_CLR:集合中删除指定socket;FD_ISSET:判断一个socket是否在一个集合中。
        fd_set clientSockets;
        FD_ZERO(&clientSockets);//清零。
        FD_SET(socketServer,&clientSockets);//添加一个元素。

        FD_CRL(socketServer,&clientSockets);//删除指定元素。一定要close。
        //closesocket(socketServer);

        FD_ISSET(socketServer,&clientSockets);//判断一个元素是否在集合中。在返回非0,不在返回0。
        


        //关闭释放。
        
        
        closesocket(socketServer);
        //清理网络库。
        WSACleanup();
        free(lpw);
        system("pause");
        return 0;
    }
     

  • 相关阅读:
    【1582. 二进制矩阵中的特殊位置】
    网络安全(黑客)自学
    python类中的下划线
    蜜雪冰城、茶颜悦色“卷”向咖啡赛道
    软考 --- 数据库(1)数据库基础
    android的通知使用
    JAVA使用Grafana和Loki抓取聚合日志
    Docker 启动远程服务访问不了
    phpstorm去掉升级提示
    关于小程序 scroll
  • 原文地址:https://blog.csdn.net/qq_52119661/article/details/126280513