1. 程式人生 > >Tcp/Ip協議理解_2

Tcp/Ip協議理解_2

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