linux網路程式設計基礎API
阿新 • • 發佈:2018-12-31
建立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:存放返回的服務名