struct sockaddr_in {
__uint8_t
sin_len;
sa_family_t
sin_family;
in_port_t
sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
sin_family指代協議族,在socket編程中只能是AF_INET
sin_port儲存連接埠號碼(使用網路位元組順序)
sin_addr儲存IP地址,使用in_addr這個資料結構
sin_zero是為了讓sockaddr與sockaddr_in兩個資料結構保持大小相同而保留的空位元組。
sin_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");
上面我們提到sockaddr,現在我也簡單的說一下
struct sockaddr { unsigned short sa_family; char sa_data[14]; }; sa_family是地址家族,一般都是“AF_xxx”的形式。通常大多用的是都是AF_INET,代表TCP/IP協議族。 sa_data是14位元組協議地址。 這個資料結構用做bind、connect、recvfrom、sendto等函數的參數,指明地址資訊。但一般編程中並不直接針對此資料結構操作,而是使用另一個與sockaddr等價的資料結構,就是我們上面提到的sockaddr_in;
上面我們還提到了一個資料結構struct in_addr sin_addr,這裡也簡單的介紹一下
typedef struct in_addr {
union{
struct { unsigned char s_b1,s_b2,s_b3,s_b4; } S_un_b;
struct { unsigned short s_w1,s_w2; } S_un_w;
struct { unsigned long S_addr; } S_un;
} IN_ADDR;
結構體in_addr 用來表示一個32位的IPv4地址.
in_addr_t 一般為 32位的unsigned long.
其中每8位代表一個IP地址位中的一個數值.
例如192.168.3.144記為0xc0a80390,其中b1 為192 ,b2 為 168, b3 為 3 , b4 為 144