sockaddr 和 sockaddr_in 的坑

結構:

sockaddr

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

其中,sa_data將端口信息和地址信息混在一起了。不推薦直接操作該結構體,而是類型轉換而來。

sockaddr_in

struct sockaddr_in {
  __kernel_sa_family_t  sin_family;     /* Address family       */
  __be16        sin_port;               /* Port number          */
  struct in_addr    sin_addr;           /* Internet address     */
​
  /* Pad to size of `struct sockaddr'. */
  unsigned char     __pad[__SOCK_SIZE__ - sizeof(short int) -
            sizeof(unsigned short int) - sizeof(struct in_addr)];
};

in_addr

typedef uint32_t in_addr_t;
struct in_addr
  {
    in_addr_t s_addr;
  };

通常的用法是:

  struct sockaddr_in my_addr; 

  my_addr.sin_family = AF_INET;     
  my_addr.sin_port = htons(MYPORT);     
  my_addr.sin_addr.s_addr = inet_addr("192.168.0.1");

  使用時,強轉:
        (struct sockaddr *)&my_addr

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