from:
初學者很容易對二者有困惑的感覺,下面來講一下二者的區別。
sockaddr是在標頭檔案 /usr/include/bits/socket.h 中定義的,如下:
view source
print?
1.
struct
sockaddr
2.
;
而sockaddr_in是在標頭檔案 /usr/include/netinet/in.h 中定義的,如下:
view source
print?
01.
/* structure describing an internet socket address. */
02.
struct
sockaddr_in
03.
;
14.
15.
/* internet address. */
16.
typedef
uint32_t in_addr_t;
17.
struct
in_addr
18.
;
二者的占用的記憶體大小是一致的,因此可以互相轉化,從這個意義上說,他們並無區別。
sockaddr常用於bind、connect、recvfrom、sendto等函式的引數,指明位址資訊。是一種通用的套接字位址。而sockaddr_in 是internet環境下套接字的位址形式。所以在網路程式設計中我們會對sockaddr_in結構體進行操作。使用sockaddr_in來建立所需的資訊,最後使用型別轉化就可以了。下面是乙個完整的例子。
view source
print?
01.
#include
02.
#include
03.
#include
04.
#include
05.
06.
int
main(
int
argc,
char
**argv)
07.
題外話,兩個函式 htons() 和 inet_addr()。
htons()作用是將埠號由主機位元組序轉換為網路位元組序的整數值。(host to net)
inet_addr()作用是將乙個ip字串轉化為乙個網路位元組序的整數值,用於sockaddr_in.sin_addr.s_addr。
inet_ntoa()作用是將乙個sin_addr結構體輸出成ip字串(network to ascii)。比如:
view source
print?
1.
printf
(
"%s"
,inet_ntoa(mysock.sin_addr));
htonl()作用和htons()一樣,不過它針對的是32位的,而htons()針對的是兩個位元組,16位的。
與htonl()和htons()作用相反的兩個函式是:ntohl()和ntohs()。
sockaddr in和sockaddr二者區別
2011 07 29 15 28 482人閱讀 0 收藏 舉報 cpp view plain copy print?structsockaddr sockaddr in和sockaddr結構的關係 填值的時候使用sockaddr in結構,而作為函式 如socket,listen,bind等 的引數...
sockaddr和sockaddr in的區別
struct sockaddr和struct sockaddr in這兩個結構體用來處理網路通訊的位址。在各種系統呼叫或者函式中,只要和網路位址打交道,就得用到這兩個結構體。1 位址型別 ipv4還是ipv6 2 ip位址 3 埠 相應的,標頭檔案有如下定義 c include struct soc...
SOCKADDR和SOCKADDR IN的區別
二者的占用的記憶體大小是一致的,因此可以互相轉化,從這個意義上說,他們並無區別。sockaddr常用於bind connect recvfrom sendto等函式的引數,指明位址資訊。是一種通用的套接字位址。而sockaddr in 是internet環境下套接字的位址形式。所以在網路程式設計中我...