• Windows编程 网络编程常见结构体


    网络地址结构

    typedef struct sockaddr_in {
    
    #if(_WIN32_WINNT < 0x0600)
    
        short   sin_family;     //地址族
    
    #else //(_WIN32_WINNT < 0x0600)  
    
       ADDRESS_FAMILY sin_family;
    
    #endif //(_WIN32_WINNT < 0x0600)
    
        USHORT sin_port;   //端口
    
        IN_ADDR sin_addr;  //地址信息(同样是结构体)
    
        CHAR sin_zero[8];  //是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。
    
    } SOCKADDR_IN, *PSOCKADDR_IN;
    typedef struct in_addr { 
            union { 
                    struct { UCHAR s_b1,s_b2,s_b3,s_b4; } S_un_b; 
                    struct { USHORT s_w1,s_w2; } S_un_w; 
                    ULONG S_addr;  //IP地址 
            } S_un; 
    #define s_addr  S_un.S_addr /* can be used for most tcp & ip code */ 
    #define s_host  S_un.S_un_b.s_b2    // host on imp 
    #define s_net   S_un.S_un_b.s_b1    // network 
    #define s_imp   S_un.S_un_w.s_w2    // imp 
    #define s_impno S_un.S_un_b.s_b4    // imp # 
    #define s_lh    S_un.S_un_b.s_b3    // logical host 
    } IN_ADDR, *PIN_ADDR, FAR *LPIN_ADDR;

     填值的时候使用sockaddr_in结构,而作为函数(如socket, listen, bind等)的参数传入的时候转换成sockaddr结构就行了,毕竟都是16个字符长。

     inet_addr()是将一个点分制的IP地址字符串(如192.168.0.1)转换为上述结构中需要的32位IP地址

    inet_addr( )和inet_ntoa ( )

    unsigned long PASCAL FAR inet_addr (const char FAR * cp);
    
    char FAR * PASCAL FAR inet_ntoa (struct in_addr in);

    inet_addr函数需要一个字符串作为其参数,该字符串指定了以点分十进制格式表示的IP地址(例如:192.168.0.16)。而且inet_addr函数会返回一个适合分配给S_addr的u_long类型的数值。

    Inet_ntoa函数会完成相反的转换,它接受一个in_addr结构体类型的参数并返回一个以点分十进制格式表示的IP地址字符串

    关于字节序可以参考我另一篇博文:http://www.cnblogs.com/Aion/p/3423832.html

     

     

    struct  hostent {
            char    FAR * h_name;           /* official name of host 主机名指针*/
            char    FAR * FAR * h_aliases;  /* alias list 别名指针*/
            short   h_addrtype;             /* host address type 地址类型*/
            short   h_length;               /* length of address 地址长度*/
            char    FAR * FAR * h_addr_list; /* list of addresses 地址列表*/
    #define h_addr  h_addr_list[0]          /* address, for backward compat 列表中第一个地址*/
    };
    hostent是host entry的缩写,该结构记录主机的信息,包括主机名、别名、地址类型、地址长度和地址列表。之所以主机的地址是一个列表的形式,原因是当一个主机有多个网络接口时,自然有多个地址。
  • 相关阅读:
    原 java调整数据顺序是奇数位于偶数的前面(思路与实现)
    队列和栈是什么,列出它们的区别?
    python 虚拟环境创建
    系统架构知识
    Git 管理代码
    继承类构造方法使用
    if __name__=="__main__"
    django 项目创建
    python unittest的使用
    python ddt/paramunittest的使用
  • 原文地址:https://www.cnblogs.com/Aion/p/3410535.html
Copyright © 2020-2023  润新知