《TCP IP網路程式設計》第十二章 I O復用

2021-10-08 01:32:14 字數 3159 閱讀 1677

使用select函式:

#include

#include

intselect

(int maxfd, fd_set* readset, fd_set* writeset, fd_set* exceptset,

const

struct timeval* timeout)

; maxfd 監視物件檔案描述符數量

readset 將所有關注「是否存在待讀取資料」的檔案描述符註冊到fd_set型變數,並傳遞其位址值

writeset 將所有關注「是否可傳輸無阻塞資料」的檔案描述符註冊到fd_set型變數,並傳遞其位址值

exceptset 將所有關注「是否發生異常」的檔案描述符註冊到fd_set型變數,並傳遞其位址值

timeout 呼叫select函式後,為防止陷入無線阻塞的狀態,傳遞超時資訊

返回值 發生錯誤返回-

1,超時返回0。因發生關注的事件返回時,返回大於0的值,該值是發生事件的檔案描述符數

select函式呼叫示例:

#include

#include

#include

#include

#define buf_size 30

intmain

(int argc,

char

* ar**)

else

if(result ==0)

else}}

return0;

}

執行結果:

[root@vm_0_10_centos io]# gcc select.c -o select

[root@vm_0_10_centos io]# .

/select

hitime-out!

himessage from console:hihi

himessage from console:hi

okmessage from console:ok

nihaoa

message from console:nihaoa

time-out!

time-out!

hehehe

message from console:hehehe

time-out!

基於i/o復用的回聲伺服器:

echo_selectserv.c :

#include

#include

#include

#include

#include

#include

#include

#include

#define buf_size 100

void

error_handling

(char

* buf)

;int

main

(int argc,

char

* ar**)

serv_sock =

socket

(pf_inet, sock_stream,0)

;memset

(&serv_adr,0,

sizeof

(serv_adr));

serv_adr.sin_family = af_inet;

serv_adr.sin_addr.s_addr =

htonl

(inaddr_any)

; serv_adr.sin_port =

htons

(atoi

(ar**[1]

));if

(bind

(serv_sock,

(struct sockaddr*

)&serv_adr,

sizeof

(serv_adr))==

-1)if

(listen

(serv_sock,5)

==-1)

fd_zero

(&reads)

;fd_set

(serv_sock,

&reads)

; fd_max = serv_sock;

while(1

)if(fd_num ==0)

for(i=

0;i++i)

printf

("connected client: %d\n"

,clnt_sock);}

else

else}}

}}close

(serv_sock)

;return0;

}void

error_handling

(char

* buf)

課後題:

(1)請解釋復用技術的通用含義,並說明何為i/o復用。

復用技術指為了提高物理裝置的效率,用最少的物理要素傳遞最多資料時使用的技術。同樣,i/o復用是指將需要i/o的套接字**在一起,利用最少限度的資源來收發資料的技術

(2)多程序併發伺服器的缺點有哪些?如何在i/o復用伺服器端中彌補?

多程序併發伺服器的服務方式是,每當客戶端提出連線要求時,就會追加生成程序。但構建程序是一項非常有負擔的工作,因此,向眾多客戶端提供服務存在一定的侷限性。而復用伺服器則是將套接字的檔案描述符**在一起管理的方式,因此可以乙個程序管理所有的i/o操作

(3)判斷題,有個選項拿不準:

若已通過select函式註冊為監視物件,則後續呼叫select函式時無需重複註冊?

(4)select函式的觀察物件中應包含伺服器端套接字(監聽套接字),那麼應將其包含到哪一類監聽物件集合?請說明原因

伺服器套接字的作用是監聽有無連線請求,即判斷接收的連線請求是否存在?應該將其包含到「讀」類監聽物件的集合中

(5)select函式使用的fd_set結構體在windows和linux中具有不同的宣告。請說明區別,同時解釋存在區別的必然性

linux的檔案描述符從0開始遞增,因此可以找出當前檔案描述符數量和最後生成的檔案描述符之間的關係。但windows的套接字控制代碼並非從0開始,並且控制代碼的整數值之間並無規律可循,因此需要直接儲存控制代碼的陣列和記錄控制代碼數的變數

第十二章 網路管理

1.使用者模式與特權模式 使用者模式 可以使用一些基本的查詢命令 進入特權模式命令 switch enable 退出特權模式 switch exit 啟用命令查詢 注意 可以用tab鍵補齊命令,自選引數為使用者自定義引數,可選引數為交換機設定的引數。檢視交換機配置 switch show runni...

Objective C 程式設計 第十二章

預處理程式語句使用 開頭,一行中的第乙個非空字元。大部分內容都與c語言類似,相當於複習啦。預定義不是變數。不能為它賦值。實際上是字元的簡單替換。define語句常放在 import或 include語句後邊。定義乙個名稱後,可以在任何地方使用。一般放在標頭檔案,方便在多個原始檔中使用。所有預定義的名...

第十二章 併發程式設計

1 併發 邏輯控制流在時間上重疊 2 併發程式 使用應用級併發的應用程式稱為併發程式。3 三種基本的構造併發程式的方法 1 需要乙個sigchld處理程式,來 僵死子程序的資源。2 父子程序必須關閉各自的connfd拷貝。對父程序尤為重要,以避免儲存器洩露。3 套接字的檔案表表項中的引用計數,直到父...