1. 程式人生 > >linux網路程式設計基礎API

linux網路程式設計基礎API

這裡寫圖片描述

建立socket

函式原型:

int socket(int domain, int type, int protocol);

函式功能

建立一個可讀、可寫、可控制、可關閉的檔案描述符,呼叫成功返回socket,失敗返回-1。

引數解釋:

  • domain : 使用哪個底層協議族
  • type : 指定服務型別
  • protocol : 設定為0,表示預設協議

命名socket

函式原型

int bind(int sockfd, const struct sockaddr* my_addr, socklen_t addrlen);

函式功能

將my_addr所指的socket地址分配給未命名的sockfd,成功返回0,失敗返回-1並設定errno(EACCES或EADDRINUSE)。

引數解釋

  • my_addr:TCP/IP協議族又sockaddr_in和sockaddr_in6兩個專用socket地址結構體,其中儲存地址族,埠號等資訊,在傳參時轉換為sockaddr型別。

監聽socket

函式原型

int listen(int sockfd, int backlog);

函式功能

建立一個監聽佇列以存放待處理的客戶連線,成功返回0,失敗返回-1並設定errno。

引數解釋

  • sockfd: 指定被監聽的socket
  • backlog:提示核心監聽佇列的最大長度,典型值為5,監聽佇列如果超過backlog,伺服器不受理新的客戶連線。

接受連線

函式原型

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

函式功能

從listen監聽佇列中接受一個連結,成功返回一個新的socket,該socket唯一標識了被接受的這個連線

引數解釋

  • addr:用來獲取被接受連線的遠端socket地址。

發起連線

函式原型

int connect(int sockfd, const struct
sockaddr *serv_addr, socklen_t addrlen);

函式功能

客戶端通過這個函式主動與伺服器建立連線(伺服器通過listen呼叫來被動接受連線)成功返回0,一旦成功,sockfd唯一標識這個連線。客戶通過讀寫這個sockfd來通訊。失敗返回-1並置errno(ECONNREFUSED和ETIMEDOUT)。

引數解釋

  • sockfd:由socket系統呼叫返回一個socket。
  • serv_addr:伺服器監聽的socket地址。
  • addrlen:指定這個地址的長度。

TCP讀寫

函式原型

TCP
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
UDP
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr,socklen_t addrlen);
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);

函式功能

socket資料讀寫
UDP與TCP不同在於每次傳送都要通過最後兩個引數獲取傳送端的socket地址,因為UDP沒有連線的概念。recvfrom和sendto也可用於面向連線,只需將後兩個引數置NULL。

函式引數

  • buf:指定緩衝區位置
  • len:指定緩衝區大小
  • flags :MSG_OOB:傳送或接受緊急資料(帶外資料)。

socket選項

函式原型

int getsockopt(int sockfd, int level, int option_name, void *option_value, socklen_t * restrict option_len);
int setsockopt(int sockfd, int level, int option_name, const void* option_value, socklen_t option_len);

函式功能

用來讀取和設定socket檔案描述符屬性的方法。

option_name引數說明

  • SO_REUSEADDR 強制使用被處於TIME_WAIT狀態的連線佔用的socket地址。
  • SO_RCVBUF和SO_SNDBUF:TCP接收緩衝區和傳送緩衝區的大小。

獲取IP地址函式

函式原型

int getaddrinfo(const char *hostname, const char *service, const struct addrinfo *hints, struct addrinfo **result);

int getnameinfo(const struct sockaddr *sockaddr, socklen_t addrlen, char *host, socklen_t hostlen, char *serv, socklen_t servlen, int flags);

函式功能

通過主機名獲得IP地址,通過服務名獲得埠號
通過socket地址獲取以字串表示的主機名和服務名

引數解釋

  • hostname:可以接受主機名或字串表示的IP地址
  • service:接受服務名或者字串表示的十進位制埠號
  • hints:設定NULL,表示允許函式反饋任何有用的結果
  • result:指向一個儲存函式反饋結果的連結串列
  • host:存放返回的主機名
  • serv:存放返回的服務名