socket程式設計 sockaddr_in 和sockaddr和in_addr詳解【轉】

七月清風發表於2020-11-04

sockaddr

sockaddr 是通用的socket地址,具體到Internet socket,用下面的結構,二者可以進行型別轉換

sa_family是地址家族,一般都是“AF_xxx”的形式。通常大多用的是都是AF_INET,代表TCP/IP協議族

sa_data是14位元組協議地址。

此資料結構用做bind、connect、recvfrom、sendto等函式的引數,指明地址資訊。但一般程式設計中並不直接針對此資料結構操作,而是使用另一個與sockaddr等價的資料結構

struct hostent {    
    char *h_name; /* 主機的官方域名 */    
   char **h_aliases; /* 一個以NULL結尾的主機別名陣列 */    
   int h_addrtype; /* 返回的地址型別,在Internet環境下為AF-INET */    
   int h_length; /* 地址的位元組長度 */    
   char **h_addr_list; /* 一個以0結尾的陣列,包含該主機的所有地址*/    
};    


#define h_addr h_addr_list[0] /*在h-addr-list中的第一個地址*/    

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

sockaddr_in

通常的用法是:

  int   sockfd;  
  struct   sockaddr_in   my_addr;  
  sockfd   =   socket(AF_INET,   SOCK_STREAM,   0);     
   
  my_addr.sin_family   =   AF_INET;     
  my_addr.sin_port   =   htons(MYPORT);     
  my_addr.sin_addr.s_addr   =   inet_addr("192.168.0.1");  
   
  bzero(&(my_addr.sin_zero),   8);     
    
  bind(sockfd,   (struct   sockaddr   *)&my_addr,   sizeof(struct   sockaddr));
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 */  
        };   

in_addr

struct   in_addr   {    
                union {  
                        struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;  
                        struct { u_short s_w1,s_w2; } S_un_w;  
                        u_long S_addr;   
                } S_un;  
  
                #define s_addr  S_un.S_addr  

struct in_addr就是32位IP地址

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");
inet_addr()是將一個點分制的IP地址(如192.168.0.1)轉換為上述結構中需要的32位IP地址(0xC0A80001)。

muahao@aliyun.com

相關文章