天天看點

Unix 網絡程式設計 讀書筆記2

第三章 套接字程式設計簡介

每一個 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;
};      
Unix 網絡程式設計 讀書筆記2
Unix 網絡程式設計 讀書筆記2