struct sockaddr{
unsignedshort sa_family;
charsa_data[14];
};
此數(shù)據(jù)結(jié)構(gòu)用做bind、connect、recvfrom、sendto等函數(shù)的參數(shù),指明地址信息。
但一般編程中并不直接針對此數(shù)據(jù)結(jié)構(gòu)操作,而是使用另一個(gè)與sockaddr等價(jià)的數(shù)據(jù)結(jié)構(gòu)
sockaddr_in(在netinet/in.h中定義):
struct sockaddr_in {
short intsin_family;
unsignedshort int sin_port;
struct in_addr sin_addr;
unsignedchar sin_zero[8];
};
struct in_addr {
unsignedlong s_addr;
};
typedef struct in_addr {
union{
struct{
unsigned char s_b1,
s_b2,
s_b3,
s_b4;
}S_un_b;
struct{
unsignedshort s_w1,
s_w2;
}S_un_w;
unsigned long S_addr;
}S_un;
} IN_ADDR;
sin_family指代協(xié)議族,在socket編程中只能是AF_INET
sin_port存儲端口號(使用網(wǎng)絡(luò)字節(jié)順序)
sin_addr存儲IP地址,使用in_addr這個(gè)數(shù)據(jù)結(jié)構(gòu)
sin_zero是為了讓sockaddr與sockaddr_in兩個(gè)數(shù)據(jù)結(jié)構(gòu)保持大小相同而保留的空字節(jié)。
s_addr按照網(wǎng)絡(luò)字節(jié)順序存儲IP地址
sockaddr_in和sockaddr是并列的結(jié)構(gòu),指向sockaddr_in的結(jié)構(gòu)體的指針也可以指向
sockadd的結(jié)構(gòu)體,并代替它。也就是說,你可以使用sockaddr_in建立你所需要的信息,
在最后用進(jìn)行類型轉(zhuǎn)換就可以了bzero((char*)&mysock,sizeof(mysock));//初始化
mysock結(jié)構(gòu)體名
mysock.sa_family=AF_INET;
mysock.sin_addr.s_addr=inet_addr("192.168.0.1");
……
等到要做轉(zhuǎn)換的時(shí)候用:
(struct sockaddr*)mysock
想來你是要進(jìn)行網(wǎng)絡(luò)編程,使用socket, listen, bind等函數(shù)。
你只要記住,填值的時(shí)候使用sockaddr_in結(jié)構(gòu),而作為函數(shù)的參數(shù)傳入的時(shí)候轉(zhuǎn)換成sockaddr結(jié)構(gòu)就行了,畢竟都是16個(gè)字符長。
IP地址和如何處理它們
現(xiàn)在我們很幸運(yùn),因?yàn)槲覀冇泻芏嗟暮瘮?shù)來方便地操作IP 地址。沒有必要用手工計(jì)算它們,也沒有必要用"<<"操作來儲存成長整字型。首先,假設(shè)你已經(jīng)有了一個(gè)sockaddr_in結(jié)構(gòu)體ina,你有一個(gè)IP地址"132.241.5.10"要儲存在其中,你就要用到函數(shù)inet_addr(),將IP地址從點(diǎn)數(shù)格式轉(zhuǎn)換成無符號長整型。使用方法如下:
ina.sin_addr.s_addr = inet_addr("132.241.5.10");
注意,inet_addr()返回的地址已經(jīng)是網(wǎng)絡(luò)字節(jié)格式,所以你無需再調(diào)用函數(shù)htonl()。
我們現(xiàn)在發(fā)現(xiàn)上面的代碼片斷不是十分完整的,因?yàn)樗鼪]有錯(cuò)誤檢查。顯而易見,當(dāng)inet_addr()發(fā)生錯(cuò)誤時(shí)返回-1。記住這些二進(jìn)制數(shù)字?(無符號數(shù))-1僅僅和IP地址255.255.255.255相符合!這可是廣播地址!大錯(cuò)特 錯(cuò)!記住要先進(jìn)行錯(cuò)誤檢查。
好了,現(xiàn)在你可以將IP地址轉(zhuǎn)換成長整型了。有沒有其相反的方法呢?它可以將一個(gè)in_addr結(jié)構(gòu)體輸出成點(diǎn)數(shù)格式?這樣的話,你就要用到函數(shù)inet_ntoa()("ntoa"的含義是"network to ascii"),就像這樣:
printf("%s",inet_ntoa(ina.sin_addr));
它將輸出IP 地址。需要注意的是inet_ntoa()將結(jié)構(gòu)體in-addr作為一個(gè)參數(shù),不是長整形。同樣需要注意的是它返回的是一個(gè)指向一個(gè)字符的指針。它是一個(gè)由inet_ntoa()控制的靜態(tài)的固定的指針,所以每次調(diào)用inet_ntoa(),它就將覆蓋上次調(diào)用時(shí)所得的IP地址。
愛華網(wǎng)



