Tcp/Ip協議理解_2
阿新 • • 發佈:2018-11-21
Linux網路程式設計基礎API
- socket地址API(port ip
- socket基礎API ( 建立 命名 監聽socket 接受連結 發起連線 讀寫資料 獲取地址資訊 檢測帶外標記 設定socket選項
- 網路資訊API (主機和IP地址之間的轉換 服務名稱和埠號之間的轉換 netdb.h
1.socket地址API
- 大端:高位位元組在記憶體的低地址處 (網路
- 小段:低位位元組(0~7) 在記憶體的高地址處 ( 主機
#include<netinet/in.h> unsigned long int htonl(unsigned long int hostlong); //轉換IP unsigned short int htons(unsigned short int hostshort); //轉換port unsigned long int ntohl(unsigned long int netlong); unsigned short int ntohs(unsigned short int netshort);
2.通用socket地址(
#include<bits/socket.h> struct sockaddr { sa_family_t sa_family; //地址族 AF_INET AF_UNIX AF_INET6 對應協議族(domain PF_INET PF_UNIX 。。。char sa_data[14]; //存放socket地址值 }
3.專用socket地址
- linux為各個協議族提供專門的socket地址結構體
- UNIX本地協議族
-
#include<sys/un.h> struct sockaddr_un { sa_family_t sin_family;/*地址族:AF_UNIX*/ char sun_path[108];/*檔案路徑名*/ };
4.TCP/IP協議族
- IPv4
struct sockaddr_in { sa_family_t sin_family;/*地址族:AF_INET*/ u_int16_t sin_port;/*埠號,要用網路位元組序表示*/ struct in_addr sin_addr;/*IPv4地址結構體,見下面*/ }; struct in_addr { u_int32_t s_addr;/*IPv4地址,要用網路位元組序表示*/ }; struct sockaddr_in6 { sa_family_t sin6_family;/*地址族:AF_INET6*/ u_int16_t sin6_port;/*埠號,要用網路位元組序表示*/ u_int32_t sin6_flowinfo;/*流資訊,應設定為0*/ struct in6_addr sin6_addr;/*IPv6地址結構體,見下面*/ u_int32_t sin6_scope_id;/*scope ID,尚處於實驗階段*/ }; struct in6_addr { unsigned char sa_addr[16];/*IPv6地址,要用網路位元組序表示*/ };
5.IP地址轉換函式
我們通常使用點分十進位制字串表示IPv4地址 但程式設計中需要把他們轉換為二進位制整數 方便使用
#include<arpa/inet.h> in_addr_t inet_addr(const char*strptr); int inet_aton(const char*cp,struct in_addr*inp); char*inet_ntoa(struct in_addr in);
inet_addr 函式用點分十進位制字串表示的IPv4地址 轉化為網路位元組序整數表示的IPv4地址
inet_aton 函式同上 將結果儲存於inp指向的地址結構體 成功返回1 失敗0
inet_ntoa 將網路位元組序表示的IPv4轉換為 點分十進位制
#include<arpa/inet.h> int inet_pton(int af,const char*src,void*dst); const char*inet_ntop(int af,const void*src,char*dst,socklen_t cnt);
inet_pton 與上面得函式功能相同 af AF_INET 等
inet_ntop 相反 cnt 指定目標儲存單元大小
可以通過巨集指定
#include<netinet/in.h> #define INET_ADDRSTRLEN 16 #define INET6_ADDRSTRLEN 46