• sockaddr和sockaddr_in的区别


    在socket编程中我们都会用到bind()函数和connect()函数,其第二个参数都是指向sockaddr类型的指针,其函数声明如下:

    int bind(SOCKET s,  const struct sockaddr FAR* name,  int namelen);
    参数:

             s             指定将要绑定的套接字。

         name         指向sockaddr结构的指针变量。

         namelen    指定该地址结构的长度。


    需要着重说明的是name参数,由于该地址结构是为所有的地址家族准备的,这个结构通常会随所使用的网络协议的不同而不同,但是第一个成员都是占两个字节;sockaddr的结构体如下:

    struct sockaddr 
    {
        u_short sa_family;  
        CHAR sa_data[14];   // Up to 14 bytes of direct address.
    };

    在这个结构体中sa_family必须指定为AF_INET,成员sa_data[14]只是起到占位的作用,随不同的协议而发生变化,但是总大小不变,都是16字节


    在基于TCP/IP的socket编程过程中,我们可以用sockaddr_in结构体来替换sockaddr,其结构体如下:

    struct sockaddr_in 
    {
        short    sin_family;  //地址族     2Byte 
        USHORT   sin_port;    //端口号     2Byte
        IN_ADDR  sin_addr;    //IPV4地址   4Byte
        CHAR     sin_zero[8]; //起站位作用 8Byte
    };
    IN_ADDR的结构体如下:

    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;
        } S_un;
    } IN_ADDR;

    可以发现IN_ADDR是实际上是个联合体,大小为4个字节,union类型的字节大小为成员当中最大的那一个,S_un_b ,S_un_w,S_addr三个成员都是4个字节,因此IN_ADD大小也就4个字节

    在实际编程过程中,我们需要将sockaddr_in指针强制转为化sock_addr类型的指针,如下所示:

        SOCKADDR_IN addrSrv;
        addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
        addrSrv.sin_family = AF_INET;
        addrSrv.sin_port = htons(6000);
    
        //绑定套接字
        bind(socketSrv,(SOCKADDR*)&addrSrv, sizeof(SOCKADDR));


  • 相关阅读:
    LeetCode 127. Word Ladder 单词接龙(C++/Java)
    LeetCode 681. Next Closest Time 最近时刻 / LintCode 862. 下一个最近的时间 (C++/Java)
    LeetCode 682. Baseball Game 棒球比赛(C++/Java)
    LeetCode 218. The Skyline Problem 天际线问题(C++/Java)
    小数据池,编码
    字典
    列表
    常见的数据类型
    while循环
    初始python
  • 原文地址:https://www.cnblogs.com/jinxiang1224/p/8468322.html
Copyright © 2020-2023  润新知