網絡編程實習報告

[實習目的]

網絡編程實習報告

通過理論聯繫實際,鞏固所學的知識,提高處理實際問題的能力,併為自己能順利與社會環境接軌做準備。[實習任務]Linux下網絡服務器開發(基於C語言);本文總結了我對Linux下網絡服務器模型的認識。[實習內容]一.循環服務器1.循環服務器在同一個時刻只可以響應一個客户端的請求,對多個客户程序的處理是採用循環的方式進行; 2. UDP循環服務器的實現非常簡單:UDP服務器每次從套接字上讀取一個客户端的請求,處理, 然後將結果返回給客户機;2.1.算法如下(UDP服務器): socket(...);

bind(...);

while(1)

{

recvfrom(...);

process(...);

sendto(...);

}3. TCP循環服務器的實現也不難:TCP服務器接受一個客户端的連接,然後處理,完成了這個客户的所有請求後,斷開連接;3.1. 算法如下(TCP服務器):

socket(...);

bind(...);

listen(...);

while(1)

{

accept(...);

while(1)

{

read(...);

process(...);write(...);

}

close(...);

}3.2. TCP循環服務器一次只能處理一個客户端的請求.只有在這個客户的所有請求都滿足後, 服務器才可以繼續後面的請求.這樣如果有一個客户端佔住服務器不放時,其它的客户機都不能工作了.因此,TCP服務器一般很少用循環服務器模型的. 二. 併發服務器1. 為了彌補循環TCP服務器的缺陷,人們又想出了併發服務器的模型。併發服務器的思想是每一個客户機的請求並不由服務器直接處理,而是服務器創建一個子進程來處理;2.使用併發服務器可以使服務器進程在同一個時刻有多個子進程和不同的客户程序連接、通信;在客户程序看來,服務器可以同時併發地處理多個客户的請求;3.算法如下(TCP服務器):socket(...);

bind(...);

listen(...);

while(1)

{

accept(...);

if(fork(..)==0)

{

close(...);while(1)

{

read(...);

process(...);

write(...);

}

close(...);

exit(...);

}

close(...);

}4. TCP併發服務器可以解決TCP循環服務器客户機獨佔服務器的情況,改善了對客户程序的響應速度;不過也同時帶來了一個不小的問題:為了響應客户機的請求,服務器要創建子進程來處理,而創建子進程是一種非常消耗資源的操作,這明顯增加了系統調度的開銷;5. 為了解決創建子進程帶來的系統資源消耗,人們又想出了多路複用I/O模型.5.1.該模型一般用函數select和相關的四個宏定義:intselect(intfd,fd_set*readfds,fd_set*writefds,fd_set*exceptfds,structtimeval*timeout)

voidFD_SET(intfd,fd_set*fdset)

voidFD_CLR(intfd,fd_set*fdset)

voidFD_ZERO(fd_set*fdset)

intFD_ISSET(intfd,fd_set*fdset)5.2. 一般的來説當我們在向文件讀寫時,進程有可能在讀寫時候阻塞,直到一定的條件滿足.比如我們從一個套接字讀數據時,可能緩衝區裏面沒有數據可讀(通信的對方還沒有發送數據過來),這個時候我們的讀調用就會等待(阻塞)直到有數據可讀.如果我們不希望阻塞,我們的一個選擇是把socket設置為非阻塞模式來實現;int socketfd;socketfd=socket(AF_INET,SOCK_STREAM,0);fcntl(socketfd,F_SETFL,O_NONBLOCK);通過設置socket為非阻塞模式,可以實現“輪循”多個socket,當企圖從一個沒有數據等待處理的非阻塞socket讀取數據時,函數立即返回,但是這種“輪循”會使CPU處於忙等待方式,降低了性能,select函數解決了這個問題;5.3. 在我們調用select時進程會一直阻塞直到以下的一種情況發生.1)有文件可以讀.2)有文件可以寫.3)超時所設置的時間到;5.4.算法如下(多路複用I/O模型):初始化(socket,bind,listen);

while(1)

{ 設置監聽讀寫文件描述符(FD_*);

調用select;

如果是傾聽套接字就緒,説明一個新的連接請求建立

建立連接(accept);

加入到監聽文件描述符中去;

否則説明是一個已經連接過的描述符

進行操作(read或者write);}

多路複用I/O可以解決資源限制的問題.着模型實際上是將UDP循環模型用在了TCP上面.這也就帶來了一些問題.如由於服務器依次處理客户的請求,所以可能會導致有的客户會等待很久。 三.I/O模型1.網絡服務器模型根據I/O模型的不同實現而來的;2. I/O模型分為同步I/O和異步I/O;同步I/O又包括阻塞I/O、非阻塞I/O、信號驅動I/O、多路複用I/O;可根據不同的要求利用不同的I/O模型實現不同是網絡服務器。[實習心得] 通過近幾個月的實習,基本上掌握了Linux下C語言網絡編程的一些算法和技巧,提高了自己的能力。專業:計算機網絡技術 班級:03631 學號:63103089 姓名:呂亮亮——XX.05.23