sockaddr_in中sin_zero的意義,以及sockaddr_in sockaddr in_addr區(qū)別聯(lián)系

sa_family是地址家族,是AF_xxx
的形式。常設(shè)為AF_INET
,代表Internet(TCP/IP)地址族。
sa_data是協(xié)議地址,由sa_family決定。
如果sa_family=AF_INET,則sa_data就是sockaddr_in的sin_addr和sin_port。
換句話(huà)說(shuō),這時(shí)sockaddr可以當(dāng)作sockaddr_in看。
sin_family意義與sa_family同。
sin_port存儲(chǔ)端口號(hào)(使用網(wǎng)絡(luò)字節(jié)順序)
sin_addr存儲(chǔ)IP地址,使用in_addr這個(gè)數(shù)據(jù)結(jié)構(gòu)
sin_zero是為了讓sockaddr與sockaddr_in兩個(gè)數(shù)據(jù)結(jié)構(gòu)保持大小相同而保留的空字節(jié)。
在in_addr結(jié)構(gòu)體中,s_addr按照網(wǎng)絡(luò)字節(jié)順序存儲(chǔ)IP地址。
sin_zero用來(lái)將sockaddr_in結(jié)構(gòu)填充到與struct sockaddr同樣的長(zhǎng)度,可以用bzero()或memset()函數(shù)將其置為零。
指向sockaddr_in的指針和指向sockaddr的指針可以相互轉(zhuǎn)換,這意味著如果一個(gè)函數(shù)所需參數(shù)類(lèi)型是sockaddr類(lèi)型時(shí),你可以在函數(shù)調(diào)用的時(shí)候?qū)⒁粋€(gè)指向sockaddr_in的指針轉(zhuǎn)換為指向sockaddr的指針;或者相反。
想來(lái)你是要進(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è)字符長(zhǎng)。