zoukankan      html  css  js  c++  java
  • sockaddr与sockaddr_in的关系

    WIN7+VS2013

    sockaddr

    //
    // Structure used to store most addresses.
    //
    typedef struct sockaddr {
    
    #if (_WIN32_WINNT < 0x0600)
        u_short sa_family;
    #else
        ADDRESS_FAMILY sa_family;           // Address family.
    #endif //(_WIN32_WINNT < 0x0600)
    
        CHAR sa_data[14];                   // Up to 14 bytes of direct address.
    } SOCKADDR, *PSOCKADDR, FAR *LPSOCKADDR;
    sockaddr_in
    //
    // IPv4 Socket address, Internet style
    //
    
    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_IN, *PSOCKADDR_IN;

    二者的占用的内存大小是一致的,因此可以互相转化,从这个意义上说,他们并无区别。
    sockaddr常用于bind、connect、recvfrom、sendto等函数的参数,指明地址信息。是一种通用的套接字地址。而sockaddr_in 是internet环境下套接字的地址形式。所以在网络编程中我们会对sockaddr_in结构体进行操作。使用sockaddr_in来建立所需的信息,最后使用类型转化就可以了。

    题外话,两个函数 htons() 和 inet_addr()。
    htons()作用是将端口号由主机字节序转换为网络字节序的整数值。(host to net)
    inet_addr()作用是将一个IP字符串转化为一个网络字节序的整数值,用于sockaddr_in.sin_addr.s_addr。


    inet_ntoa()作用是将一个sin_addr结构体输出成IP字符串(network to ascii)。


    htonl()作用和htons()一样,不过它针对的是32位的,而htons()针对的是两个字节,16位的。
    与htonl()和htons()作用相反的两个函数是:ntohl()和ntohs()。

    Keep it simple!
    作者:N3verL4nd
    知识共享,欢迎转载。
  • 相关阅读:
    第5周进度条
    《掌握需求过程》阅读笔记02
    第3周进度条
    《掌握需求过程》阅读笔记01
    问题账户需求分析
    2016年秋季个人阅读计划
    Arrays.sort解析
    算法排序
    Oracl Over函数
    Maven初步
  • 原文地址:https://www.cnblogs.com/lgh1992314/p/6616394.html
Copyright © 2011-2022 走看看