C語言socket編程----struct sockaddr 和struct sockaddr_in介紹和初始化


sockaddr結構體

struct  sockaddr{

  sa_family_t  sa_family; //地址族,最常用的是"AF_INET"(IPV4)和"AF_INET6"(IPV6); 

  char  sa_data[14];      //包含套接字中的目標地址和端口信息;

};

sockaddr的缺陷:sa_data把目標地址和端口信息混在一起了

 

sockaddr_in 結構體
sockaddr_in結構體解決了sockaddr的缺陷,把port和addr 分開儲存在兩個變量中

struct  sockaddr_in/  struct  sockaddr_in6結構體 

struct  sockaddr_in{

  sa_family_t   sin_family;  //地址族,常用AF_INET

  uint16_t         sin_port;     //16位TCP/UDP端口號

  struct  in_addr  sin_addr;    //32位IP地址

  cha         sin_zero[8]   //不使用

};

struct  in_addr{

  in_addr_t    s_addr;      //32位IPV4地址

}

 

struct sockaddr_in6 {

   sa_family_t     sin6_family; /* AF_INET6 */

   in_port_t      sin6_port; /* port number */

   uint32_t       sin6_flowinfo; /* IPv6 flow information */

   struct in6_addr    sin6_addr; /* IPv6 address */

   uint32_t        sin6_scope_id; /* Scope ID (new in 2.4) */

};

struct in6_addr {

  unsigned  char s6_addr[16]; /* IPv6 address */

};

struct  sockaddr_in6相關詳見 :http://man7.org/linux/man-pages/man7/ipv6.7.html

 

初始化和賦值:

IPV4

struct sockaddr_in ina;
bzero(&ina,sizeof(ina));
ina.sin_family=AF_INET;
ina.sin_port=htons(23);
ina.sin_addr.s_addr = inet_addr("132.241.5.10");

 

IPV4相關例子參考 http://www.cnblogs.com/huqian23456/archive/2011/02/22/1961822.html

 

 

IPV6 

const   ipv6_addr = "::1";    //IPV6地址

struct   sockaddr saddr;
memset(&saddr, 0, sizeof(saddr));  /  /初始化結構體
saddr.sa_family = AF_INET6;
inet_pton(AF_INET6,ipv6_addr,saddr.sa_data);    //設置地址

struct sockaddr_in6 from_addr;
bzero(&from_addr,sizeof(from_addr));    //初始化結構體
from_addr.sin6_family = AF_INET6;   //設置地址家族
from_addr.sin6_port = htons(800);    //設置端口
inet_pton(AF_INET6,ipv6_addr,from_addr.sin6_addr.s6_addr );   //設置地址


inet_pton inet_ntop 地址轉換相關詳見 https://www.cnblogs.com/s7vens/archive/2011/12/12/2284964.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM