struct sockaddr和struct sockaddr_in這兩個結構體用來處理網絡通信的地址。在各種系統調用或者函數中,只要和網絡地址打交道,就得用到這兩個結構體。網絡中的地址包含3個方面的屬性:
1 地址類型; 2 ip地址; 3 端口
上圖看結構:
#include <sys/in.h>
#include <sys/socket.h>
#include <sockaddr.h>
我們從這個宏定義開始,可以看到宏__SOCKADDR_COMMON事實上是聲明一個變量,類型是unsigned short int,sa_prefix是變量名的前綴,宏的##表示連接的意思,即family作爲變量名的後半部分,所以我們在socket編程的時候是爲變量sin_family賦值。
另外宏裏面還可以使用#,表示把宏參數變爲一個字符串。
講解了宏__SOCKADDR_COMMON的含義,sockaddr和sockaddr_in的結構內容相信大家都能看懂,我們注意一下,sockaddr和sockaddr_in第一個變量都是用2字節存放地址類型,區別在於sockaddr_in第二個和第三個變量端口號和地址,第四個變量是字節填充,而sockaddr只剩下第二個變量放置data,可以看到這兩個結構體的長度是一樣的。
在平常編程中把類型、ip地址、端口填充sockaddr_in結構體,然後強制轉換成sockaddr,作爲參數傳遞給系統調用函數。
sockaddr常用於bind、connect、recvfrom、sendto等函數的參數,指明地址信息。是一種通用的套接字地址。而sockaddr_in是internet環境下套接字的地址形式。所以在網絡編程中我們會對sockaddr_in結構體進行操作。使用sockaddr_in來建立所需的信息,最後使用類型轉化就可以了