基本TCP套接字編程總結

1.分配一個套接口的描述字及其所用的資源

int socket(int family,int type, int protocol);
//family指定協議族
//type指定套接字類型
//protocol指定爲某個協議常數值
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4
family 選項
AF_INET IPv4協議
AF——INET6 IPv6套接字
AF_LOCAL Unix域協議
AF_ROUTE 路由套接字
AF_KEY 密鑰套接字
type 選項
SOCK_STREAM 字節流套接字
SOCK_DGRAM 數據報套接字
SOCK_SEQPACKET 有序分組套接字
SOCK_RAW 原始套接字
protocol 選項
IPPROTO_TCP TCP傳輸協議
IPPROTO_UDP UDP傳輸協議
IPPROTO_SCTP SCTP傳輸協議

2.把本地協議地址給與一個套接字

int bind( int sockfd , const struct sockaddr * my_addr, socklen_t addrlen);
//sockfd是你創建的這個套接字
//my_addr是一個 指向一個特定協議的地址結構 的指針
//addrlen是該地址結構的長度
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

bind函數可以指定端口號或者IP,或者兩個都指定,也可以都不指定 
端口對於bind
j沒有綁定端口,以後客戶端執行connect或者服務端執行listen時候,內核會指定特定的端口。讓內核給客戶程序選擇端口算正常,但是這樣一個”隨意的端口”對於服務器很糟糕,因爲服務器是通過他們自己有名的端口來工作的。 
IP對於bind : 
綁定IP,對於客戶程序,相當於在該套接字上發送的IP數據報指定源IP地址。對於服務器程序,相當於值接收那些以該IP爲目的地址的連接請求。不綁定IP,對於客戶程序,根據外出網絡接口選擇源IP,如果是服務器程序,內核把客戶程序發送的SYN的目的地值IP作爲服務器源地址IP。

由於bind第二個參數是const類型,因此在沒有指定端口情況下,內核也沒有辦法通過bind函數返回端口值,爲了得到這個臨時端口值,要用getsockname函數來得到協議地址:

int getsockname(int sockfd, struct sockaddr *localaddr, socklen_t *addrlen);
  • 1
  • 2
  • 1
  • 2

3.把套接字轉換成被動套接字,並且爲內核規定相應套接字排隊的最大排隊數。

int listen(int sockfd, int backlog);
//sockfd是要被轉換的主動套接字
//backlog是最大排隊數
/*對於backlog,它是未連接隊列和已連接隊列的。在未連接隊列的套接字還沒有進行完三次握手,處於SYN_RCVD狀態,套接字在未連接一項中存在時間越爲一個RTT。在已連接隊列的套接字處於ESTABLISHED狀態。
*/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

4 開始接納客戶請求。

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
//返回值是一個全新的,已連接套接字描述符,會包含客戶端的IP和端口。用戶進程的協議地址和協議大小,可以用NULL代替。
  • 1
  • 2
  • 1
  • 2

5 TCP客戶端在socket之後會建立和TCP服務器的連接

 int connect(int s, const struct sockaddr * name, int namelen);
  • 1
  • 1

客戶在調用connect前不必要調用bind函數,內核會確定源IP地址和臨時端口。 
connect會激發TCP三次握手的第一次,即客戶程序發送SYN請求,服務器程序會在accept時候給客戶端發送SYN和ACK,即第二次握手。 
connect調用失敗的原因如下
1.TCP客戶程序沒有受到SYN分節的相應,返回ETIMEDOUT錯誤標識。 
2.對客戶程序的SYN相應RST,表明服務端指定端口沒有進程在等待與客戶程序連接,返回ECONNREFUSED錯誤標識。 
3.客戶發出的SYN在路由過程中產生路由不可達並返回給客戶,客戶在一定事件之後返回EHOSTUNREACH或者ENETUNREACH標識。

6.萬事大吉,開始收工。

int close(int sockfd); 
  • 1
  • 1

close默認操作是把sockfd標記成已關閉,然後立刻返回到調用進程。並且調用進程不能再使用這個表述符。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章