第一篇:網絡編程實習報告
廣東應屆生實習報告網在線編輯整理本文。
[實習目的]
通過理論聯系實際,鞏固所學的知識,提高處理實際問題的能力,并為自己能順利與社會環境接軌做準備。[實習任務]Linux下網絡服務器開發;本文總結了我對Linux下網絡服務器模型的認識。[實習內容]一.循環服務器1.循環服務器在同一個時刻只可以響應一個客戶端的請求,對多個客戶程序的處理是采用循環的方式進行;2.UDp循環服務器的實現非常簡單:UDp服務器每次從套接字上讀取一個客戶端的請求,處理,然后將結果返回給客戶機;2.1.算法如下:socket(...);
bind(...);
while(1)
{
recvfrom(...);
process(...);
sendto(...);
}3.TCp循環服務器的實現也不難:TCp服務器接受一個客戶端的連接,然后處理,完成了這個客戶的所有請求后,斷開連接;3.1.算法如下:
socket(...);
bind(...);
listen(...);
while(1)
{
accept(...);
while(1)
{
read(...);
process(...);write(...);
}
close(...);
}3.2.TCp循環服務器一次只能處理一個客戶端的請求.只有在這個客戶的所有請求都滿足后,服務器才可以繼續后面的請求.這樣如果有一個客戶端占住服務器不放時,其它的客戶機都不能工作了.因此,TCp服務器一般很少用循環服務器模型的.二.并發服務器1.為了彌補循環TCp服務器的缺陷,人們又想出了并發服務器的模型。并發服務器的思想是每一個客戶機的請求并不由服務器直接處理,而是服務器創建一個子進程來處理;2.使用并發服務器可以使服務器進程在同一個時刻有多個子進程和不同的客戶程序連接、通信;在客戶程序看來,服務器可以同時并發地處理多個客戶的請求;3.算法如下: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設置為非阻塞模式來實現;intsocketfd;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.算法如下:初始化(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 
第二篇:網絡編程實習報告
[實習目的]
通過理論聯系實際,鞏固所學的知識,提高處理實際問題的能力,并為自己能順利與社會環境接軌做準備。[實習任務]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
第三篇:網絡編程實習作業
網絡編程實習作業
一. 實習內容:
? 了解插口(socket)實現原理。
? 在某一種平臺(Linux,Unix系列或Windows系列)下進行網絡客戶機-服務器編程。
二. 主要參考書目:
? W.Richard Stevens, “UNIX Network Programming Networking APIs: Scokets and XTI(Volume 1,Second Edition)”,清華大學出版社 Prentice-Hall International, Inc.或其中文版 “UNIX網絡編程(第1卷,第2版)” 經典讀物,目前的最新版是第三版
? Douglas Comer,《用TCP/IP進行網際互連 第3卷:客戶機-服務器編程和應用(第2版)》 或其英文版 Internetworking With TCP/IP Vol III: Client-Server Programming And Application(Second Edition)以下簡稱《客戶機-服務器編程》
三. 實習題目:
1:編寫DAYTIME服務的UDP客戶機和服務器的實現。
基本要求:
當服務器端收到客戶端的請求后,將當前daytime返回給客戶端,客戶端收到該回應后,將收到的daytime顯示到輸出中。
(其中在Linux或Unix環境中,當前daytime的獲得參考函數time()和ctime())
2:熟悉Http協議的請求和響應格式,編寫一個簡單的Http服務器。題目描述參考《自上而下計算機網絡》(第三版 作者James F.Kurose)第二章課后編程作業1。
基本要求:正確解析Http請求,實現簡單的GET請求回應。模擬一個對象(如:文件index.html)的GET回應(如:回應一個字符串),對于其他的對象,則根據Http響應格式回應對象不存在信息。3 通過瀏覽器可檢測自己的程序。如:輸入,查看其響應結果。對http請求的處理必須采用多進程實現,即主進程負責等待請求連接,每當收到一個請求后,產生一個子進程對該請求做單獨處理,主進程繼續等待新請求,子進程在處理完其請求后結束自己。詳細要求參考課本要求。(多進程編程參考函數fork())
要求:
源程序部分帶有必要的注釋,備有一份文檔說明各個程序中的思路和關鍵技術。注意,只能使用C語言編寫。可以是windows或者linux下可執行,二種環境選擇一種即可。
評分標準
90% 以上 :在程序說明文檔中,可以體現出自己對本程序所用到的技術有較深刻的理解。
程序有較好的可讀性(關鍵部分的注釋比較詳細)。
80% :符合要求,程序說明的比較詳細,思路比較清楚。
70% :只有程序沒有說明文檔的,70%-60% :缺少說明文檔
60% 以下 :程序或說明文檔完全和別人的一樣(抄襲于被抄襲者一樣處理)。
注:作業包括程序部分(.c,.cpp,.h等源碼和.exe等可執行文件,不要.obj 等其他文件)和程序說明文檔,文件大小最好不要超過1M。程序說明要體現出你所用到的關鍵技術,要說清楚自己定義函數的功能及實現,要有關鍵部分的流程圖。要按時交作業,晚交的要相應的扣分。請將程序打成一個包,包名統一采用“學號_姓名”形式,然后發到
network_tju@163.com
郵件的Title也是“學號_姓名”
請一定將學號放在前面
5截至日期:2009年4月20日
(注:1.以郵箱接收到的時間戳為準。2.在提交作業時,請最好選擇發送并保存郵件,避免由于投遞失敗而導致作業無法按時完成。(就是避免死無對證)3.杜絕抄襲,請盡早開始著手這項作業)
第四篇:《網絡編程課程設計》實習總結
河北科技師范學院歐美學院
實習類型教學實習實習單位河北科技師范學院歐美學院實習起止時間年月 年日 指導教師劉正林所在院(系)信息技術系專業班級網專1101學生姓名崔珺珺學號
一、實習的基本概況
(一)理論指導
根據實訓內容自行確定
(二)項目情況
項目名稱:企業門戶網站
開發環境:Windows XP
項目分工情況:
我的任務:制作企業門戶網站框架
二、實習過程或步驟
新建一個記事本文件,開始填寫代碼,我所做的是一家廣告公司的主頁面,所以題目的代碼是這么寫的:
這樣,超鏈接的字體是黑色的,但鼠標指向它以后就是紅色的。
從互聯網下載一張名為1后綴為JPG的圖片,“XX廣告,行業的領頭者”下一步編寫代碼,并且將該1.JPG放入主頁所在的文件夾,代碼部分如下:

對網頁上半部分的框架表格進行處理,的對字體、字號進行設置,代碼如下:
了解了一些代碼的含義,比如
為了使網頁有簡單的交互性在主頁上設置了一個登錄界面和按鈕,代碼如下
我連接了一個新建名為1.HTML的網頁,主要是自己弄不太懂有關數據庫的知識,所以只能簡單的編寫,這樣不論在用戶名、密碼輸入什么,都能跳入第二個頁面。
進行了左側表格框架的設計編寫,代碼如下:
服務導航
三、實習感受
(一)成績與收獲
通過這次網頁制作實習課程,我更加深入的了解了各種代碼語言的作用,從互聯網上學習了更多的知識。學習制作網頁,必須先從學習HTML語言做起,弄清楚各種語言在制作網頁中的重要作用,通過這次綜合性實驗,我已經可以靈活運用所學知識和技巧制作簡單的網頁。實驗過程中,我盡量充分運用老師教過的知識,對所學知識有一定的鞏固作用,為了做出更好的效果我也翻閱參考了其他的資料,學習到了更多網頁處理的技巧,制作網頁過程中我遇到了不少的問題,通過詢問同學和查找資料都獲得了 解決的辦法,這次實踐對我而言是一個不小的提升,在實踐過程中學習鞏固對知識能有更深的記憶。網頁制作是一門很實用的學科,值得我們以后更深入的去學習。現在我掌握的制作知識還是太少,需要以后多與老師、同學們交流,自己在網絡上也需要更加深入的挖掘有關知識。
(二)問題與不足
對一些代碼的作用不了解,亂加運用導致頁面混亂,而且缺少獨自處理錯誤與難題的能力,對于有些知識僅是一看就過,其實自己根本沒有掌握,而且掌握了的也是一知半解,沒有將知識加以用工,總是想做些什么但是真到了做的時候不會,還得去翻書。
第五篇:網絡編程實驗報告
實驗一 TCP Socket API程序設計
一、預備知識
1.網絡編程基本概念
網絡上的計算機間的通訊,實質上是網絡中不同主機上的程序之間的通訊。在互聯網中使用IP地址來標識不同的主機,在網絡協議中使用端口號來標識主機上不同進程,即使用(IP地址,端口號)二元組。
套接字(Socket)用于描述IP地址和端口,是一個通信鏈的句柄,通信時一個網絡程序將要傳輸的一段信息寫入它所在主機的Socket中,該Socket通過與網絡接口卡相連的傳輸介質將這段信息發送到另一臺主機的Socket中,以供其他程序使用。
圖1-1 TCP通信流程 2.TCP通信流程
TCP程序是面向連接的,程序運行后,服務器一直處于監聽狀態,客戶端與服務器通信之前必須首先發起連接請求,由服務器接收請求并在雙方之間建立連接后才可以互相通信。
二、實驗目的
1.了解Winsock API編程原理; 2.掌握TCP Socket程序的編寫; 3.了解C/S模式的特點; 4.學會解決實驗中遇到的問題。
三、實驗任務
使用Winsock API相關類實現TCP Socket通信程序,并能成功運行。
四、實驗環境及工具
1.Windows2000/XP/7 2.Visual C++開發平臺 3.Visual Studio2010
五、實驗內容和步驟
參照《Visual C++網絡編程教程》書中81頁,TCP Socket API程序設計。連接:
void CChatClientDlg::OnConnect(){
WSADATA wsd;
//WSADATA結構
WSAStartup(MAKEWORD(2,2),&wsd);
//加載協議,使用Winsock 2.2版
m_client = socket(AF_INET,SOCK_STREAM,0);//創建流式套接字
//服務器地址
sockaddr_in serveraddr;
UpdateData();
if(ServerIP.IsBlank())
{
AfxMessageBox(“請指定服務器IP!”);
return;
}
if(sPort.IsEmpty())
{
AfxMessageBox(“請指定端口!”);
return;
}
//獲取服務器進程的IP和端口
BYTE nFild[4];
CString sIP;
ServerIP.GetAddress(nFild[0],nFild[1],nFild[2],nFild[3]);
sIP.Format(“%d.%d.%d.%d”,nFild[0],nFild[1],nFild[2],nFild[3]);
//設置服務器地址結構的內容
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.S_un.S_addr = inet_addr(sIP);
serveraddr.sin_port = htons(atoi(sPort));
//發起連接須指明要訪問的服務器進程地址,這個地址存儲在serveraddr中
if(connect(m_client,(sockaddr*)&serveraddr,sizeof(serveraddr))!= 0)
{
MessageBox(“連接失敗”);
return;
}
else
{
m_ListWords.AddString(“連接服務器成功!”);
m_ListWords.SetTopIndex(m_ListWords.GetCount()1);
ServerIP.EnableWindow();
ServerPort.EnableWindow();
m_ButtonConnect.EnableWindow();
m_ButtonDisconnect.EnableWindow(false);
m_EditWords.EnableWindow(false);
m_ButtonSend.EnableWindow(false);
m_ButtonExit.EnableWindow();}
“發送”按鈕事件過程代碼如下:
void CChatClientDlg::OnSend(){
//向服務器發送信息
UpdateData();
if(m_sWords.IsEmpty())
{
AfxMessageBox(“發送的消息不能為空!”);
return;
}
//開始發送數據
int i = send(m_client,m_sWords.GetBuffer(0),m_sWords.GetLength(),0);
m_ListWords.AddString(“發送:” + m_sWords);
m_ListWords.SetTopIndex(m_ListWords.GetCount()1);
closesocket(m_client);
ServerIP.EnableWindow();
ServerPort.EnableWindow();
m_ButtonConnect.EnableWindow();
m_ButtonDisconnect.EnableWindow(false);
m_EditWords.EnableWindow(false);
m_ButtonSend.EnableWindow(false);
m_ButtonExit.EnableWindow();} “清空”按鈕的事件過程: m_ListWords.ResetContent();“關于”按鈕的事件過程: CAboutDlg dlgAbout;dlgAbout.DoModal();
服務器端: 開始監聽代碼:
void CChatServerDlg::OnListen(){
WSADATA wsd;
//WSADATA結構
WSAStartup(MAKEWORD(2,2),&wsd);
//加載協議棧,使用Winsock 2.2版
m_server = socket(AF_INET,SOCK_STREAM,0);//創建流式套接字
//將網絡中的事件關聯到窗口的消息函數中,定義消息號為20000,偵測客戶端的連接請求
WSAAsyncSelect(m_server,m_hWnd,20000,FD_ACCEPT);
m_client = 0;
BYTE nFild[4];
CString sIP;
UpdateData();
if(ServerIP.IsBlank())
{
AfxMessageBox(“請設置IP地址!”);
return;
}
if(sPort.IsEmpty())
{
AfxMessageBox(“請設置監聽端口!”);
return;
}
ServerIP.GetAddress(nFild[0],nFild[1],nFild[2],nFild[3]);
sIP.Format(“%d.%d.%d.%d”,nFild[0],nFild[1],nFild[2],nFild[3]);
//服務器地址
sockaddr_in serveraddr;
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.S_un.S_addr = inet_addr(sIP);
serveraddr.sin_port = htons(atoi(sPort));
//綁定地址
if(bind(m_server,(sockaddr*)&serveraddr,sizeof(serveraddr)))
{
MessageBox(“綁定地址失敗.”);
return;
}
//監聽開始,服務器等待連接請求的到來
listen(m_server,5);
m_ListWords.AddString(“監聽開始:”);
m_ListWords.AddString(“地址” + sIP + “ 端口” + sPort);
m_ListWords.AddString(“等待客戶端連接??”);
//界面完善
m_ListWords.SetTopIndex(m_ListWords.GetCount()-1);
ServerIP.EnableWindow(false);
ServerPort.EnableWindow(false);
m_ButtonListen.EnableWindow(false);
m_ButtonStopListen.EnableWindow();
m_ButtonClear.EnableWindow();
m_ButtonExit.EnableWindow(false);} “停止監聽”按鈕事件過程代碼如下: void CChatServerDlg::OnStopListen(){
//停止監聽
closesocket(m_server);
m_ListWords.AddString(“停止監聽”);
m_ListWords.SetTopIndex(m_ListWords.GetCount()1);} “斷開”按鈕事件過程代碼如下: void CChatServerDlg::OnDisconnect(){
closesocket(m_client);
m_ListWords.AddString(“與客戶端斷開”);
m_ListWords.SetTopIndex(m_ListWords.GetCount()1);
//界面完善
m_ButtonDisconnect.EnableWindow();
m_EditWords.EnableWindow();
m_ButtonSend.EnableWindow();} ReceiveData()函數代碼如下:
void CChatServerDlg::ReceiveData(){
//接收客戶端的數據
char buffer[1024];
int num = recv(m_client,buffer,1024,0);
buffer[num] = 0;
CString sTemp;
sTemp.Format(“收到:%s”,buffer);
m_ListWords.AddString(sTemp);//顯示信息
m_ListWords.SetTopIndex(m_ListWords.GetCount()1);
closesocket(m_client);//關閉與客戶端通信的Socket
WSAAsyncSelect(m_server,m_hWnd,20000,FD_ACCEPT);//準備接收新的客戶端連接
//界面完善
m_ButtonDisconnect.EnableWindow(false);
m_EditWords.EnableWindow(false);
m_ButtonSend.EnableWindow(false);} 服務器的初始化代碼如下: //界面初始化
m_ButtonStopListen.EnableWindow(false);m_ButtonDisconnect.EnableWindow(false);m_ButtonClear.EnableWindow(false);m_EditWords.EnableWindow(false);m_ButtonSend.EnableWindow(false);
運行結果:
六、思考題
1.用Winsock API編程時,主要進行哪些通行的操作步驟? 2.闡述C/S模式的通信過程。答:
1.通行的操作
1.Winsock的打開(WSAStartup())。2.建立套接字(socket()或WSASocket())。3.地址綁定(bind())。
4.服務器監聽連接(listen())。
5.客戶端提出連接申請(connect()或WSAConnect())。6.服務器接收客戶端的連接請求(accept()或WSAAccept())。7.數據的發送(send()或WSASend(),sendto()或WSASendTo())。8.數據的接收(recv()或WSARecv(),recvfrom()或WSARecvfrom())。9.關閉套接字(closesocket())。10.關閉Winsock(WSACleanup())。
2通信過程