標籤:style blog color 資料 div log ad 伺服器
socket函數,為了執行網路I/O,一個進程必須做的第一件事就是調用socket函數,並且指定通訊協定類型。
#include<sys/socket.h>int socket (int family, int type, int protocol); //成功返回非負描述符,出錯-1
其中family參數指明了協議族,AF_INET(IPv4), AF_INET6(IPv6);type參數指明通訊端的類型,SOCK_STREAM(位元組流) , SOCK_DGRAM(資料包)。
connet函數,TCP客戶用connet函數來建立與TCP伺服器的串連。
#include<sys/socket.h>int connect(int sockfd, const struct sockadd* servaddr, socklet_addrlen);//成功返回0,出錯-1
sockfd是由socket函數返回的通訊端描述符,第二,第三個參數分別是一個指向通訊端地址結構的指標和該結構的大小。servaddr必須包含由伺服器的ip地址和連接埠號碼。
客戶在調用connect函數前不必非得調用bind函數,核心會確定源ip,並選擇一個臨時連接埠。
bind函數,bind函數把一個本地地址協議賦予一個通訊端。
#include<sys/socket.h>int bind(int sockfd,const struct sockaddr* myaddr,socklen_t addrlen);//成功返回0,出錯-1
myaddr是一個指向特定協議的地址結構的指標,啊ddr了addrlen是該地址結構的長度。對於TCP,調用bind函數可以制定ip地址,連接埠號碼。
listen函數,僅由TCP伺服器調用,當socket函數建立一個通訊端的時候,預設建立出的是一個主動通訊端,也就是說是一個將調用connect發起串連的客戶通訊端。listen函數把一個未串連的通訊端轉換成一個被動通訊端,指示核心應接受指向該通訊端的串連請求。
#include<sys/socket.h>int listen(int sockfd, int backlog);// 成功返回0, 出錯-1
backlog為未完成串連隊列與完成但未被應用進程接受隊列長度之和。
accept函數,由TCP伺服器調用,用於從已完成串連隊列頭返回下一個已完成的串連,如果已完成串連隊列為空白,那麼進程將阻塞。
#include<sys/socket.h>int accept(int sockfd, struct sockaddr*cliaddr, socklen_t *addrlen)//成功非負描述字,出錯-1
參數cliaddr和addrlen用來返回已串連的對端進程的協議地址。如果accept成功,那麼傳回值是由核心自動產生的一個全新通訊端,代表與客戶的TCP串連。