上午學習tinyhttpd的源碼,sockaddr 結構體以前沒接觸過,
在網絡程式設計中經常用到struct sockaddr和struct sockaddr_in,這裡簡單介紹。
在linux環境下,結構體 struct sockaddr在/usr/include/linux/socket.h 中定義,具體如下:
1
2
3
4
<code>typedef</code> <code>unsigned </code><code>short</code> <code>sa_family_t;</code>
<code>struct</code> <code>sockaddr {</code>
<code>sa_family_t sa_family; </code><code>/* address family, af_xxx */</code>
<code>char</code> <code>sa_data[14]; </code><code>/* 14 bytes of protocol address */</code>
在linux環境下,結構體 struct sockaddr_in在/usr/include/netinet/in.h 中定義,具體如下:
5
6
7
8
9
10
11
12
13
14
<code>/* structure describing an internet socket address. */</code>
<code>struct</code> <code>sockaddr_in</code>
<code>{</code>
<code>__sockaddr_common (sin_);</code>
<code>in_port_t sin_port; </code><code>/* port number. */</code>
<code>struct</code> <code>in_addr sin_addr; </code><code>/* internet address. */</code>
<code>/* pad to size of `struct sockaddr'. */</code>
<code>unsigned </code><code>char</code> <code>sin_zero[</code><code>sizeof</code> <code>(</code><code>struct</code> <code>sockaddr) -</code>
<code>__sockaddr_common_size -</code>
<code>sizeof</code> <code>(in_port_t) -</code>
<code>sizeof</code> <code>(</code><code>struct</code> <code>in_addr)];</code>
<code>/* 字元數組sin_zero[8]的存在是為了保證結構體struct sockaddr_in的大小和結構體struct sockaddr的大小相等 */</code>
<code>};</code>
struct sockaddr是通用的套接字位址,而struct sockaddr_in則是internet環境下套接字的位址形式,二者長度一樣,都是16個位元組。
二者是并列結構,指向sockaddr_in結構的指針也可以指向sockaddr。
一般情況下,需要把sockaddr_in結構強制轉換成sockaddr結構再傳入系統調用函數中。