2012-12-05 153 views
3

在下面的代碼片段中,我發現sockaddr_in類型轉換爲'sockaddr'('struct sockaddr *)& sin'。我只想知道sockaddr_in中的變量是否會相應映射到sockaddr。 以下是摘錄。C中的結構類型轉換

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

// IPv4的AF_INET套接字:

struct sockaddr_in { 
short   sin_family; // e.g. AF_INET, AF_INET6 
unsigned short sin_port;  // e.g. htons(3490) 
struct in_addr sin_addr;  // see struct in_addr, below 
char    sin_zero[8]; // zero this if you want to 
}; 

struct sockaddr_in sin; 

sin.sin_family = AF_INET; 
sin.sin_port = htons(floodport); 
sin.sin_addr.s_addr = inet_addr(argv[1]); 

//類型轉換

(struct sockaddr *) &sin // what values of sockaddr_in would be mapped to sockaddr ? 

這種轉換在套接字編程如下SENDTO()使用。

sendto(s, datagram, iph->tot_len,0, (struct sockaddr *) &sin,sizeof(sin)) 

在此先感謝。

+1

而且,你的問題到底是什麼? – wildplasser

回答

2

struct sockaddr唯一的目的就是有一種類型是傳遞給函數一樣sendto()

其實,你不使用它作其他用途,有你有other structs

  • struct sockaddr_in對現有IPv4
  • struct sockaddr_in6對IPv6
  • struct sockaddr_un爲Unix套接字
  • struct sockaddr_bth適用於藍牙
  • struct sockaddr_storage它與您的 架構中的最大一樣大。可以整齊地用於存儲您的類型 不知道的地址。
2

使用struct sockaddr的函數只會讀取sa_family並在內部執行相反的轉換(如果他們理解sa_family內部的內容)。