天天看點

套接字(socket)與socket 程式設計

  • 位元組序:
    • 主機位元組序(host byte order):不同的主機有不同的位元組序,x86:小端;
    • 網絡位元組序(network byte order):大端位元組序;

0. 什麼是套接字

  • 套接字是網絡程序間的通信(網絡程序間通信,又叫 network IPC)接口,程序用該接口能夠與其他程序通信,無論是否在同一台計算機上,
  • 套接字是對通信端點的抽象,就像檔案描述符(file descriptor)是對檔案的抽象表示;

1. 基本概念

  • socket 可以看成是使用者程序(Application,工作在使用者空間)與核心網絡協定棧(核心空間,kernel space)的程式設計接口(稱為套接口);
    • 以實作使用者空間的應用對核心網絡協定棧提供的服務的通路和調用;
    套接字(socket)與socket 程式設計

2. IPv4 套接字位址接口

$ man 7 ip           
struct sockaddr_in {
    sa_family_t    sin_family; /* address family: AF_INET */
    in_port_t      sin_port;   /* port in network byte order */
    struct in_addr sin_addr;   /* internet address */
};

/* Internet address. */
struct in_addr {
    uint32_t       s_addr;     /* address in network byte order */
};           
  • AF_INET:代表的是 IPv4 協定;
    • 此外還有 Unix 域協定;
  • Network byte order:網絡位元組序;

3. 通用位址結構

struct sockaddr {
    uint8_t sin_len;
    sa_family_t sin_family;
    char sa_data[14];
}           
  • sin_len:整個 sockaddr 結構體的長度;
  • sin_family:指定該位址家族;
  • sa_data:由 sin_family 決定其形式;

4. 位元組序轉換函數

uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t hostlong);
uint16_t ntohs(uint16_t hostshort);           
  • h:host,表示主機(主機位元組序);
  • n:network,表示網絡(網絡位元組序);
  • s:short,l:long