zoukankan      html  css  js  c++  java
  • Winsock编程基础1

    1、加载和释放Winsoke库
    //所有Winsock函数都是从WS2_32.DLL导出,包含相应库文件
    #include <winsock2.h>
    #pragma comment(lib, "WS2_32")
    //
    若没有加载,调用scok函数返回的SOCKET_ERROR出错代码为WSANOTINITIALISED int WSAStartup( WORD wVersionRequested, //指定要加载的Winsock库版本,高字节次版本, 低字节主版本号,使用MAKEWORD(x, y) LPWSADATA lWSAData //一个指向WSADATA结构的指针,用来返回DLL库的详细信息 ); typedef struct WSAData { WORD wVersion; //库文件建议应用程序使用的版本 WORD wHighVersion; //库文件支持的最高版本 char szDescription[WSADESCRIPTION_LEN+1];//库描述字符串 char szSystemStatus[WSASYS_STATUS_LEN+1];//系统状态字符串 unsigned short iMaxSockets; //同时支持的最大套接字数量 unsigned short iMaxUdpDg; //废弃 char FAR * lpVendorInfo; //废弃 } WSADATA, FAR * LPWSADATA; //成功返回0,否则要调用WSAGetLastError函数查看原因
    int WSACleanup(void)
      简单封装
    class CInitSock
    {
    public:
        CInitSock(BYTE minorVer = 2, BYTE majorVer = 2)
        {    //初始化WS2_32.DLL
            WSAADATA wsaData;
            WORD sockVersion = MAKEWORD(minorVer, majorVer);
            if(::WSAStartup(sockVersion, &wsaData) != 0)
                exit(0);
        }
        ~CInitSock()
        {
            ::WSACleanup();
        }        
    }
    Winsock寻址和字节顺序
     
    //版本1使用sockaddr兼容
    struct sockaddr {
        u_short sa_family;              /* address family */
        char    sa_data[14];            /* up to 14 bytes of direct address */
    };
    //我们一般使用TCP/IP,所以上面的TCP/IP版本为
    struct sockaddr_in {
        short   sin_family;         //地址族(即指定地址格式),AF_INET(IP地址)
        u_short sin_port;          //端口号(不要使用0-1023以免影响公共服务)
        struct  in_addr sin_addr;   //IP地址(32位)
        char    sin_zero[8];    //空字节, 设为0, 为了与sockaddr兼容
    };
    //IP地址 in_addr结构
    struct in_addr {
        union {
                struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;    //4个u_char描述
                struct { u_short s_w1,s_w2; } S_un_w;    //2个u_short描述
                u_long S_addr;    //1个u_long描述
    } S_un;
        
    //IP地址函数
    unsigned long inet_addr(const char *cp) //将点分十进制IP地址字符串转换为32位二进制表示IP地址,二进制数按网络顺序存储
    char* inet_ntoa(struct in_addr)    //将32位二进制数转换为字符
    
    //网络字节顺序为大端顺序(高字节低位), Intel为小端顺序(高字节高位)
    u_short htons(u_short hostshort)    //主机顺序转网络字节顺序
    u_long htonl(u_long hostlong)       //
    u_short ntohs(u_short hostshort)    //网络字节顺序转主机顺序
    u_long ntohl(u_long hostlong)
      初始化sockaddr_in
     
    sockaddr_in sockAddr;
    sockAddr.sin_family = AF_INET;
    sockAddr.sin_port = htons(6789);
    sockAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    //或使用下列初始化IP地址
        sockAddr.sin_addr.S_un.S_un_b.s_b1 = 127;
        sockAddr.sin_addr.S_un.S_un_b.s_b2 = 0;
        sockAddr.sin_addr.S_un.S_un_b.s_b3 = 0;
        sockAddr.sin_addr.S_un.S_un_b.s_b4 = 1;
     
     
     
     
     
     
     
  • 相关阅读:
    转傻逼是傻逼的通行证,苦逼是苦逼的墓志铭 简单
    css 表格底边框在ie6下不显示 简单
    cookie设置、读取,domain、path、expires 简单
    js事件作用域问题 简单
    js鼠标事件定位 简单
    报到证的作用 简单
    转白领一族预防空调病全攻略 简单
    The "External World" is Inside the Brain
    [转]DllMain详解
    Drill Into .NET Framework Internals to See How the CLR Creates Runtime Objects
  • 原文地址:https://www.cnblogs.com/chenxingyang/p/9747587.html
Copyright © 2011-2022 走看看