sockaddr詳解

  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");

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章