- 相關(guān)推薦
網(wǎng)絡(luò )編程實(shí)習報告
通過(guò)理論聯(lián)系實(shí)際,鞏固所學(xué)的知識,提高處理實(shí)際問(wèn)題的能力,并為自己能順利與社會(huì )環(huán)境接軌做準備。[實(shí)習任務(wù)]Linux下網(wǎng)絡(luò )服務(wù)器開(kāi)發(fā);本文總結了我對Linux下網(wǎng)絡(luò )服務(wù)器模型的認識。[實(shí)習內容]一.循環(huán)服務(wù)器1.循環(huán)服務(wù)器在同一個(gè)時(shí)刻只可以響應一個(gè)客戶(hù)端的請求,對多個(gè)客戶(hù)程序的處理是采用循環(huán)的方式進(jìn)行; 2. UDP循環(huán)服務(wù)器的實(shí)現非常簡(jiǎn)單:UDP服務(wù)器每次從套接字上讀取一個(gè)客戶(hù)端的請求,處理, 然后將結果返回給客戶(hù)機;2.1.算法如下: socket(...);
bind(...);
while(1)
{
recvfrom(...);
process(...);
sendto(...);
}3. TCP循環(huán)服務(wù)器的實(shí)現也不難:TCP服務(wù)器接受一個(gè)客戶(hù)端的連接,然后處理,完成了這個(gè)客戶(hù)的所有請求后,斷開(kāi)連接;3.1. 算法如下:
socket(...);
bind(...);
listen(...);
while(1)
{
accept(...);
while(1)
{
read(...);
process(...);write(...);
}
close(...);
}3.2. TCP循環(huán)服務(wù)器一次只能處理一個(gè)客戶(hù)端的請求.只有在這個(gè)客戶(hù)的所有請求都滿(mǎn)足后, 服務(wù)器才可以繼續后面的請求.這樣如果有一個(gè)客戶(hù)端占住服務(wù)器不放時(shí),其它的客戶(hù)機都不能工作了.因此,TCP服務(wù)器一般很少用循環(huán)服務(wù)器模型的. 二. 并發(fā)服務(wù)器1. 為了彌補循環(huán)TCP服務(wù)器的缺陷,人們又想出了并發(fā)服務(wù)器的模型。 并發(fā)服務(wù)器的思想是每一個(gè)客戶(hù)機的請求并不由服務(wù)器直接處理,而是服務(wù)器創(chuàng )建一個(gè) 子進(jìn)程來(lái)處理;2.使用并發(fā)服務(wù)器可以使服務(wù)器進(jìn)程在同一個(gè)時(shí)刻有多個(gè)子進(jìn)程和不同的客戶(hù)程序連接、通信;在客戶(hù)程序看來(lái),服務(wù)器可以同時(shí)并發(fā)地處理多個(gè)客戶(hù)的請求; 3.算法如下:socket(...);
bind(...);
listen(...);
while(1)
{
accept(...);
if(fork(..)==0)
{
close(...);while(1)
{
read(...);
廣東應屆生聘才網(wǎng)在線(xiàn)編輯整理本文。
process(...);
write(...);
}
close(...);
exit(...);
}
close(...);
} 4. TCP并發(fā)服務(wù)器可以解決TCP循環(huán)服務(wù)器客戶(hù)機獨占服務(wù)器的情況,改善了對客戶(hù)程序的響應速度; 不過(guò)也同時(shí)帶來(lái)了一個(gè)不小的問(wèn)題:為了響應客戶(hù)機的請求,服務(wù)器要創(chuàng )建子進(jìn)程來(lái)處理, 而創(chuàng )建子進(jìn)程是一種非常消耗資源的操作,這明顯增加了系統調度的開(kāi)銷(xiāo);5. 為了解決創(chuàng )建子進(jìn)程帶來(lái)的系統資源消耗,人們又想出了多路復用I/O模型.5.1.該模型一般用函數select和相關(guān)的四個(gè)宏定義:int select(int fd,fd_set *readfds,fd_set *writefds,fd_set *exceptfds,struct timeval *timeout)
void FD_SET(int fd,fd_set *fdset)
void FD_CLR(int fd,fd_set *fdset)
void FD_ZERO(fd_set *fdset)
int FD_ISSET(int fd,fd_set *fdset)5.2. 一般的來(lái)說(shuō)當我們在向文件讀寫(xiě)時(shí),進(jìn)程有可能在讀寫(xiě)時(shí)候阻塞,直到一定的條件滿(mǎn)足. 比如我們從一個(gè)套接字讀數據時(shí),可能緩沖區里面沒(méi)有數據可讀(通信的對方還沒(méi)有 發(fā)送數據過(guò)來(lái)),這個(gè)時(shí)候我們的讀調用就會(huì )等待(阻塞)直到有數據可讀.如果我們不 希望阻塞,我們的一個(gè)選擇是把socket設置為非阻塞模式來(lái)實(shí)現;int socketfd;socketfd=socket(AF_INET,SOCK_STREAM,0);fcntl(socketfd,F_SETFL,O_NONBLOCK);通過(guò)設置socket為非阻塞模式,可以實(shí)現“輪循”多個(gè)socket,當企圖從一個(gè)沒(méi)有數據等待處理的非阻塞socket讀取數據時(shí),函數立即返回,但是這種“輪循”會(huì )使CPU處于忙等待方式,降低了性能,select函數解決了這個(gè)問(wèn)題;5.3. 在我們調用select時(shí)進(jìn)程會(huì )一直阻塞直到以下的一種情況發(fā)生. 1)有文件可以讀.2)有文件可以寫(xiě).3)超時(shí)所設置的時(shí)間到;5.4.算法如下: 初始化(socket,bind,listen
while(1)
{ 設置監聽(tīng)讀寫(xiě)文件描述符(FD_*);
調用select;
如果是傾聽(tīng)套接字就緒,說(shuō)明一個(gè)新的連接請求建立
建立連接(accept);
加入到監聽(tīng)文件描述符中去;
否則說(shuō)明是一個(gè)已經(jīng)連接過(guò)的描述符
進(jìn)行操作(read或者write); }
多路復用I/O
[網(wǎng)絡(luò )編程實(shí)習報告]相關(guān)文章:
1.網(wǎng)絡(luò )管理員實(shí)習報告總結
【網(wǎng)絡(luò )編程實(shí)習報告】相關(guān)文章:
編程實(shí)習報告07-03
《網(wǎng)絡(luò )編程課程設計》實(shí)習總結11-19
測量編程實(shí)習報告07-03
網(wǎng)絡(luò )編程的就業(yè)前景06-26
計算機編程實(shí)習報告06-29
數控編程報告03-30
計算機編程實(shí)習報告范文07-02