天天看點

結構體sockaddr與struct sockaddr_in的差別和聯系

上午學習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結構再傳入系統調用函數中。

繼續閱讀