UNIX網路程式設計學習(4)--值-結果引數

pengfoo發表於2012-03-21
 

我們已經知道,當把套介面地址結構傳遞給套介面函式時,總是通過指標來傳遞的,即傳遞的是一個指向結構的指標。結構的長度也作為引數來傳遞,其傳遞方式取決於結構的傳遞方向:從程式到核心,還是從核心到程式。

1、從程式到核心傳遞套介面地址結構有3個函式:bind、connect和sendto,這3個函式的一個引數是指向套介面地址結構的指標,另一個是結構的整數大小,例如:

struct sockaddr_in serv;

/* fill in serv{} */

connect( sockfd, (SA*)&serv, sizeof(serv) );

由於指標和指標所指結構的大小都傳遞給核心,所以從程式到核心要確切拷貝多少資料是知道的,如圖3.7所示。

套介面地址結構大小的資料型別確切地說應該是socklen_t,而不是int,POSIX建議將socklen_t定於為uint32_t。

2、與前面的傳遞方向相反,從核心到程式傳遞套介面地址結構有四個函式:accept、recvfrom、getsockname 和 getpeername。這4個函式的兩個引數是:指向套介面地址結構的指標和指向表示結構大小的整數的指標,例如:

struct sockaddr_un cli;     /* Unix domain */

socklen_t len;

len = sizeof(cli);

getpeername(unixfd, (SA*) &cli, &len )

/* len may have changed */

為何將結構大小由整數改為指向整數的指標呢?這是因為:當函式被呼叫時,結構大小是一個值(value, 此值告訴核心該結構的大小,使核心在寫此結構時不至於越界),當函式返回時,結構大小又是一個結果(result,它告訴程式核心在此結構中確切儲存了多少資訊),這種引數叫做值-結果引數(value-result)。

當使用值-結果引數作為套介面地址結構的長度時,如果套介面地址結構是定長的,則從核心返回的值也是定長的,如對於IPv4,sockaddr_in是16;對於IPv6,sockaddr_in6是28。但對於變長的套介面地址結構(如Unix域的sockaddr_un),返回值可能比結構的最大長度小。

原帖地址:http://www.cnblogs.com/ChangeIt/archive/2011/12/26/2302294.html

相關文章