linux c程式設計 網路程式設計

2022-05-30 23:57:16 字數 3619 閱讀 5903

在網路上,通訊服務都是採用

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進入阻塞狀態 伺服器監聽到...