sockaddr详解

来源:互联网 发布:js正则问号 编辑:程序博客网 时间:2024/05/07 15:04

  struct sockaddr {
       unsigned short sa_family;   /* address family, AF_xxx */
       char sa_data[14];                /* 14 bytes of protocol address */
  };

  sa_family是地址家族,一般都是“AF_xxx”的形式。通常大多用的是都是AF_INET,代表TCP/IP协议族。
  sa_data是14字节协议地址。

  此数据结构用做bind、connect、recvfrom、sendto等函数的参数,指明地址信息。但一般编程中并不直接针对此数据结构操作,而是使用另一个与sockaddr等价的数据结构 SOCKADDR_IN。

    sockaddr_in(在netinet/in.h中定义):
     struct sockaddr_in {
     short int sin_family;                  /* Address family */
     unsigned short int sin_port;      /* Port number */
     struct in_addr sin_addr;            /* Internet address */
     unsigned char sin_zero[8];       /* Same size as struct sockaddr */
  };

  typedef struct in_addr
  {
       union{
          struct        {        unsigned char s_b1,s_b2,s_b3,s_b4;   } S_un_b;
          struct   {   unsigned short s_w1,s_w2;   } S_un_w;
          struct   {   unsigned long S_addr;   } S_un;
  } IN_ADDR
       #define s_addr S_un.S_addr               /*can be used for most tcp &ip code*/
       #define s_net S_un.S_un_b.s_b1       /*network*/
       #define s_host S_un.S_un_b.s_b2     /*host on imp*/
       #define s_lh S_un.S_un_b.s_b3         /*logical host*/
       #define s_impno S_un.S_un_b.s_b4  /*imp #*/
       #define s_imp S_un.S_un_w.s_w2     /*imp*/

  sin_family指代协议族,在socket编程中只能是AF_INET
  sin_port存储端口号(使用网络字节顺序)
  sin_addr存储IP地址,使用in_addr这个数据结构
  sin_zero是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。

  s_addr按照网络字节顺序存储IP地址,
  sockaddr_in和sockaddr是并列的结构,指向sockaddr_in的结构体的指针也可以指向sockaddr的结构体,并代替它。也就是说,你可以使用sockaddr_in建立你所需要的信息, 然后用进行类型转换就可以了

       bzero((char*)&mysock,sizeof(mysock));//初始化
  sockaddr_in mysock;
  bzero((char*)&mysock,sizeof(mysock));
  mysock.sa_family=AF_INET;
  mysock.sin_port=htons(1234);//1234是端口号
  mysock.sin_addr.s_addr=inet_addr("192.168.0.1");

in_addr是一个联合体。三个结构体S_un_b、S_un_w、S_un共用一个4字节内存区。
sin_addr.S_un.S_addr = (90<<24)|(25<<16)|(14<<8)|10  = 0x5a190e0a
也就是ip地址10.14.25.90。
90存在最高字节,25存在次高字节,14存在次低字节,10存在最低字节;
也就是
sin_addr.S_un_b.s_b1=10,
sin_addr.S_un_b.s_b2=14,
sin_addr.S_un_b.s_b3=25,
sin_addr.S_un_b.s_b4=90,
也就是
sin_addr.S_un_w.s_w1=(14<<8)|10=3594,
sin_addr.S_un_w.s_w2=(90<<24)|(25<<16)=23065。
也就是
sin_addr.s_addr=inet_addr("10.14.25.90");

原创粉丝点击