在網路上,通訊服務都是採用
c/s機制,也就是客戶端
伺服器端工作流程
:使用socket()
函式建立伺服器端通訊套介面
使用bind()
函式將建立的套介面與伺服器位址繫結
使用listen()
函式使伺服器套介面做好接收連線請求準備
使用accept()
接收來自客戶端由connect()
函式發出的連線請求
根據連線請求建立連線後,使用send()
函式傳送資料,或者使用recv()
函式接收資料
使用closesocket()
函式關閉套介面(可以先用shutdown()
函式先關閉讀寫通道)
客戶端程式工作流程:
使用socket()
函式建立客戶端套介面
使用connect()
函式發出也伺服器建立連線的請求(呼叫前可以不用bind()
埠號,由系統自動完成)
連線建立後使用send()
函式傳送資料,或使用recv()
函式接收資料
使用closesocet()
函式關閉套介面
下面介紹幾個函式的用法:
socket
函式:int
socket(int domain,int type,int protocol)
引數說明:
domain:
指明協議族,也稱為協議域,是乙個常值。
af_inet:ipv4
協議af_inet6:ipv6
協議af_local/af_unix:unix
協議域af_route:
路由套接字
af_ke:
密匙套接字
type
:指明套接字的型別。
sock_strea:
位元組流套接字
sock_dgra:
資料報套接字
sock_seqpacke:
有序分組套接字
sock_raw:
原始套接字
protocol:
指明協議型別。一般為0
,以選擇給定的domain
和type
組合的系統預設值。
ipproto_tcp:tcp
傳輸協議
ipproto_udp:udp
傳輸協議
ipproto_sctp:sctp
傳輸協議
函式描述:
socket
函式在成功時返回乙個小的非負整數值,與檔案描述符類似,我們稱它為套接字
描述符,簡稱
sockfd
。為了得到這個套接字描述符,我們只是指定了協議族(ipv4
、ipv6
或unix
)和套接字型別(位元組流、資料報或原始套接字)。我們並沒有指定本地跟遠端的
協議位址
bind
函式:int
bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen);
將乙個本地協議位址賦予乙個套接字。對於網際網協議,協議位址是32
位的ipv4
位址和128
位的ipv6
位址與16
位的tcp
或udp
埠號的組合。bind
函式主要用於伺服器端,用來指定本地
主機的哪個網路介面(ip
,可以是inaddr_any
,表示本地主機的任一網路介面)可以接受客戶
端的請求,和指定埠號(即開啟的等待客戶來連線的程序)。
引數說明:
sockfd:
socket
函式返回的套接字描述符。
myaddr
、addrlen
位址結構的一般採用sockadr_in
結構體struct
sockaddr_in
listen
函式:int
listen(int sockfd,int backlog)
listen
函式的第乙個引數即為要監聽的
socket
描述字,第二個引數為相應
socket
可以排隊的最大連線個數。
socket()
函式建立的
socket
預設是乙個主動型別的,
listen
函式將socket
變為被動型別的,等待客戶的連線請求。
connetc
函式:connect
函式的第乙個引數即為客戶端的
socket
描述字,第二引數為伺服器的
socket
位址,第三個引數為
socket
位址的長度。客戶端通過呼叫
connect
函式來建立與
tcp伺服器的連線
accept
函式:int
accept(int sockfd,struct sockaddr *addr, socketen_t *add_len)
引數sockfd
引數sockfd
就是上面解釋中的監聽套接字,這個套接字用來監聽乙個埠,當有乙個客戶與伺服器連線時,它使用這個乙個埠號,而此時這個埠號正與這個套接字關聯。當然客戶不知道套接字這些細節,它只知道乙個位址和乙個埠號。
引數addr
這是乙個結果引數,它用來接受乙個返回值,這返回值指定客戶端的位址,當然這個位址是通過某個位址結構來描述的,使用者應該知道這乙個什麼樣的位址結構。如果對客戶的位址不感興趣,那麼可以把這個值設定為
null。引數
len如同大家所認為的,它也是結果的引數,用來接受上述
addr
的結構的大小的,它指明
addr
結構所占有的位元組個數。同樣的,它也可以被設定為
null。如果
accept
成功返回,則伺服器與客戶已經正確建立連線了,此時伺服器通過
accept
返回的套接字來完成與客戶的通訊。
伺服器測的**如下:對於服務端來說,首先是建立
socket
然後繫結
ip位址到
socket
上。然後開始監聽。
當接收到請求的時候,通過
recv
函式儲存在
buf陣列裡面。並且通過
send
函式向對端傳送訊息
int server_function()
}客戶端的**如下:設定好連線的
ip位址和埠後,通過
connect
發起連線。並通過
send
和recv
函式進行傳送和接收訊息
int client_function()
開啟2個終端,分別執行伺服器和客戶端的**。執行結果如下:
Linux C 網路程式設計教程
1 tcp 套接字通訊工作流程 一.面向連線的套接字socket通訊工作流程 為了實現伺服器與客戶機的通訊,伺服器和客戶機都必須建立套接字。伺服器與客戶機的工作原理可以用下面的過程來描述。1.伺服器先用 socket 函式來建立乙個套接字,用這個套接字完成通訊的監聽。2.用 bind 函式來繫結乙個...
網路socket程式設計 linux C
1 int socket int family,int type,int protocol family 指定使用的協議簇 af inet ipv4 af inet6 ipv6 af local unix協議 af route 路由套接字 af key 秘鑰套接字 type 指定使用的套接字的型別 ...
Linux C程式設計 六 之 網路程式設計 上
網路協議棧 網路基礎 tcp連線的三次握手和四次揮手 三次握手 tcp協議通過三個報文段完成連線的建立,這個過程稱為三次握手 three way handshake 過程如下圖所示。當客戶端呼叫connect時,觸發了連線請求,向伺服器傳送了syn j包,這時connect進入阻塞狀態 伺服器監聽到...