第三章 套接字程式設計簡介
每一個 Socket 都用一個半相關描述:
{協定,本地位址,本地端口}
一個完整的 Socket 則用一個相關描述
{協定,本地位址,本地端口,遠端位址,遠端端口}
每一個 Socket 有一個本地的唯一 Socket 号,由作業系統配置設定。
1.struct sockaddr
這個結構用來存儲套接字位址。
資料定義:
struct sockaddr {
unsigned short sa_family; /* address族, AF_xxx */
char sa_data[14]; /* 14 bytes的協定位址 */
};
sa_family 一般來說,都是 “AFINET”。
sa_data 包含了一些遠端電腦的位址、端口和套接字的數目,它裡面的資料是雜溶在一切的。
為了處理 struct sockaddr, 程式員建立了另外一個相似的結構 struct sockaddr_in:
struct sockaddr_in (“in” 代表 “Internet”)
struct sockaddr_in {
short int sin_family; /* Internet位址族 */
unsigned short int sin_port; /* 端口号 */
struct in_addr sin_addr; /* Internet位址 */
unsigned char sin_zero[8]; /* 添0(和struct sockaddr一樣大小)*/
};
這個結構提供了友善的手段來通路 socket address(struct sockaddr)結構中的每一個元素。注意 sin_zero[8] 是為了是兩個結構在記憶體中具有相同的尺寸,使用 sockaddr_in 的時
候要把 sin_zero 全部設成零值(使用 bzero()或 memset()函數)。而且,有一點很重要,就是一個指向 struct sockaddr_in 的指針可以聲明指向一個 sturct sockaddr 的結構。是以雖然
socket() 函數需要一個 structaddr * ,你也可以給他一個 sockaddr_in * 。注意在 struct sockaddr_in 中,sin_family 相當于 在 struct sockaddr 中的 sa_family,需要設成 “AF_INET”。
最後一定要保證 sin_port 和 sin_addr 必須是網絡位元組順序。
struct in_addr {
unsigned long s_addr;
};