第七篇:幾個經典的TCP通訊函式

穆晨發表於2017-01-29

前言

       在TCP通訊中要使用到幾個非常經典的函式,本文將對這幾個函式進行一個簡短的使用說明。

socket()函式

       函式作用:建立一個網際位元組流套接字

       包含標頭檔案:sys/socket.h ( 後面幾個函式也一樣 )

       函式原型:int socket ( int family, int type, int protocol )

       引數說明

              family:指明協議族( 如AF_INET,AF_INET6,AF_LOCAL等 )

              type:指明套接字型別( 如SOCK_STREAM,SOCK_DGRAM等 )

              protocol:直接指明某種 family 和 type 的組合而無視前2個引數,如下圖( 如果該引數為0則啟用family和type的組合型別 ):

       

       返回值說明:成功返回描述符,失敗返回-1。

connect()函式

       函式作用:與指定主機進行連線

       函式原型:int connect ( int sockfd, const struct sockaddr *servaddr, socklen_t addrlen );

       引數說明

              sockfd:要建立連線的套接字(連線是以套接字為單位建立而不是主機 )

              servaddr:要連線主機的套接字地址結構

              addrlen:servaddr的大小

       返回值說明:若成功返回0,失敗返回-1。

       特別說明

1. 該函式將激發三次握手

2. 如果TCP客戶沒有收到SYN分節響應,則返回ETIMEOUT錯誤。

3. 如果對客戶的SYN的響應是RST,則表示SYN分節正確送到但沒有服務,或者對方想取消這次連線,或者TCP接收到一個根本不存在的連線上的分節。這種情況將返回ECONNREFUSED錯誤。

4. 如果客戶發出的SYN分節在路由傳遞過程中出現了問題( 路由器返回主機不可達 ),則將返回EHOSTUNREACH或者ENETUNREACH錯誤。

bind()函式

       函式作用:把一個本地地址賦予一個套接字

       函式原型:int bind ( int sockfd, const struct sockaddr * myaddr, socklen_t addrlen )

       引數說明

              sockfd:要繫結的套接字

              myaddr:要繫結的套接字地址結構

              addrlen:上述結構的大小

       返回值說明:若成功返回0,失敗返回-1。

       特別說明:一般情況,伺服器繫結一個INADDR_ANY( 任意型 )的地址就可以了,客戶端不用繫結。

listen()函式

       函式作用:把一個未連線的套接字轉換成被動套接字

       函式原型:int listen ( int sockfd, int backlog )

       引數說明

              sockfd:要轉換的套接字

              backlog:未完成佇列+已完成佇列的長度和

       返回值說明:若成功返回0,失敗返回-1。

accept函式

       函式作用:從已完成佇列返回下一個已完成連線。

       函式原型:int accept ( int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen )

       引數說明

              sockfd:監聽套接字描述符

              cliaddr:請求連線端的套接字地址結構

              addrlen:cliaddr的大小

       返回值說明:若成功返回非負描述符,失敗返回-1。

       特別說明

1.一般情況下,一個伺服器僅僅只有一個監聽套接字,但是對每個服務請求都會建立一個已連線套接字。

2.已連線套接字在每次迴圈後都會關閉,但監聽套接字在伺服器有效期間都會開放。

相關文章