一 點睛
socket位址分為通用socket位址和專用socket位址。
通用socket位址出現在一些socket api函式中,比如bind函式、connect函式等。
專用socket位址是為了方面使用而提出來的。
兩者可以相互轉換。
二 通用socket位址
通用socket位址是乙個結構體,名字是sockaddr,定義在/usr/include/bits/socket.h中。
#include /* structure describing a generic socket address. */
struct sockaddr
;
巨集展開後的形式是
struct sockaddr
;
sa_data用來存放位址資料。
協議族位址含義和長度
pf_unix
檔案全路徑名,最大長度可達108位元組。
pf_inet
32位ipv4位址和16位埠號,共6個位元組。
pf_inet6
128位ipv6位址、16位埠號、32位流標識和32位範圍id,共26位元組。
sa_data太小了,容納不下了,怎麼辦?linux定義了新的儲存結構:
struct sockaddr_storage
;
三 專用socket位址
通用位址結構把ip位址和埠號資訊都放到乙個char陣列中,使得使用起來不方便。為此,linux為不同的協議族定義了不同的socket結構體。
1 ipv4的socket位址定義,定義於/usr/include/netinet/in.h
struct sockaddr_in
;
in_addr定義如下:
struct in_addr
;
2 ipv6的socket位址定義,定義於/usr/include/netinet/in.h
struct sockaddr_in6
;
in6_addr定義如下:
struct in6_addr
__in6_u;
#define s6_addr __in6_u.__u6_addr8
#if defined __use_misc || defined __use_gnu
# define s6_addr16 __in6_u.__u6_addr16
# define s6_addr32 __in6_u.__u6_addr32
#endif
};
3 unix本地域協議族定義,定義於/usr/include/linux/un.h
#define unix_path_max 108
struct sockaddr_un ;
這些專用的socket位址結構顯然比通用的socket位址更清楚,把各個資訊用不同的字段來表示。但要注意的是,socket api函式使用的是通用的位址結構,因此我們具體使用的時候,最終要把專用位址結構轉換為通用位址結構,不過可以強制轉換。
四 ip位址的轉換
1 點睛
函式inet_addr將點分十進位制ip位址轉換為二進位制位址
函式inet_aton將點分十進位制ip位址轉換為二進位制位址
函式inet_ntoa將二進位制位址轉換為點分十進位制ip位址
2 **
#include #include int main(int argc, const char * ar**)
3 執行
[root@localhost test]# g++ -o test test.cpp[root@localhost test]# ./testia.s_addr=0x60210acreal_ip=172.16.2.6
Socket的位址查詢
socket的位址查詢函式有很多,分為主機 host 網路 net 協議 proto 和服務 serv 這些函式完成各種位址查詢功能.posix.1定義了兩個新的函式 getaddrinfo和getnameinfo,前者把主機名字和服務名字對映到乙個位址,後者將位址轉換成主機名或伺服器名.這些函式返...
socket 的位址結構
在建立socket通訊的過程中位址起著很關鍵的作用,在設計tcp ip網路程式時,必須對 socket 的位址結構有清晰的認識。tcp ip 的位址資料結構。struct sockaddr struct in addr struct sockaddr in 網路位元組順序是tcp ip中規定好的一種...
socket 的位址結構
在建立socket通訊的過程中位址起著很關鍵的作用,在設計tcp ip網路程式時,必須對 socket 的位址結構有清晰的認識。tcp ip 的位址資料結構。struct sockaddr u short safamily 位址族,af char sa data 14 14位元組的特定協議位址 st...