Linux 面向連線的socket通訊流程

2021-07-02 14:30:10 字數 2678 閱讀 2383

說明

網路上的ip都是數字加點(192.168

.0.1)構成

struct in_addr結構使用32位的ip,如

ip(c0a80001)是192.168

.0.1

函式原型

int inet_aton(const

char *cp, struct in_addr *inp)

將a.b.c.d的ip轉換為32位的ip,儲存在 inp指標裡面

char *inet_ntoa(struct in_addr in)

將32位ip轉換為a.b.c.d的格式

說明a代表 ascii,n代表network

伺服器程式作用

初始化伺服器程式

持續監聽乙個固定的埠

收到客戶的連線後建立乙個socket連線

與客戶進行通訊和資訊處理

接收客戶通過socket連線傳送來的資料,建立乙個新的socket,

通過socket連線與客戶通訊,進行相應處理,並返回處理結果

通訊結束後中斷與客戶的連線(關閉socket)

客戶程式作用

初始化客戶程式

連線到某個伺服器上,建立socket連線

與伺服器進行通訊和資訊處理

接收伺服器通過socket連線傳送來的資料,進行相應處理

通過socket連線向伺服器傳送請求資訊

通訊結束後中斷與客戶的連線

udp實現框架

沒有乙個客戶端可以一直占用服務端

只要處理過程不是死迴圈,則伺服器對於每乙個客戶機的請求總是能夠滿足

socket(...); 

bind(...);

while(1)

tcp實現框架

每次接受乙個客戶端連線

完成某客戶所有請求後,斷開連線

socket(...); 

bind(...);

listen(...);

while(1)

close(...);

}

tcp實現框架

s = socket(...); 

bind(s, ...);

listen(s, ...);

while(1)

} }

功能描述

客戶端

使用執行緒向伺服器傳送從標準輸入得到的字元

在主線程中將從伺服器端返回的字元顯示到標準輸出

伺服器端

將客戶端發來的資料原樣返回給客戶端,每乙個客戶在伺服器上對應乙個執行緒

多路復用i/o

工作機理

程序可在多個socket上等待網路事件,當某個socket發生網路事件時,使用者可通過檢視網路事件對該socket事件進行i/o操作

要求應用程式不斷向核心寫入socket描述符,核心還應不斷掃瞄socket集來檢測狀態

實現途徑

預先構造一張描述符表,隨後通過select()選擇乙個已準備好的描述符並返回

應用場景

乙個程序中有多個客戶連線(存在多個tcp 套接字描述符),select()函式阻塞直到任何乙個描述符被啟用

避免程序為等待乙個已連線上的資料而無法處理其他連線

int

select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)

nfds:所有被監控檔案描述符中最大的乙個加1

readfds:所有要讀的檔案檔案描述符的集合

writefds:所有要寫的檔案檔案描述符的集合

exceptfds:其他需要向我們通知的檔案描述符

timeout:超時設定

執行機制

select呼叫程序一直阻塞直到以下情況之一發生

有檔案可以讀

有檔案可以寫

超時所設定的時間到

返回結果

-1:表明函式呼叫發生錯誤,錯誤號存放在errno變數中

0:表明發生超時而沒有發生其他的錯誤

大於0:表明事件發生的檔案描述符的數目

void fd_set(int fd, fd_set *fdset) 

將fd加入到fdset

void fd_clr(int fd, fd_set *fdset)

將fd從fdset裡面清除

void fd_zero(fd_set *fdset)

從fdset中清除所有的檔案描述符

int fd_isset(int fd, fd_set *fdset)

判斷fd是否在fdset集合中

功能

更多的靈活性,可編寫tcp/udp套接字不能實現的功能

可由使用者自己建立各個頭部

只能由有root許可權的使用者建立

函式原型

int sockfd(af_inet, sock_raw, protocol)

根據protocol(如ipproto_icmp, ipproto_tcp, ipproto_udp)建立不同型別原始套接字

Linux下經常使用的C C 開源Socket庫

1.linux socket programming in c 2.ace ace採用ace os適配層遮蔽各種不同的 複雜繁瑣的作業系統api。ace是乙個大型的中介軟體產品,20萬行左右,過於巨集大,一堆的設計模式,架構了一層又一層。它龐大 複雜。適合大型專案。開源 免費。不依賴第三方庫。使用的...

Linux下 面向連線的 UDP通訊

1 編寫udp server程式的步驟 1 使用socket 來建立乙個udp socket,第二個引數為sock dgram。2 初始化sockaddr in結構的變數,並賦值 這裡使用 2030 作為服務程式的埠,使用 inaddr any 作為繫結的ip位址即任何主機上的位址。3 使用bind...

linux下安裝gd庫並且支援socket

gd 2.0.33.tar.gz jpegsrc.v6b.tar.gz libpng 1.2.7.tar.tar zlib 1.2.2.tar.gz freetype 2.1.9.tar.gz php 4.3.9.tar.gz 二 安裝 1.安裝zlib tar zxvf zlib 1.2.2.ta...