第一篇:网络编程实习报告
广东应届生实习报告网在线编辑整理本文。
[实习目的]
通过理论联系实际,巩固所学的知识,提高处理实际问题的能力,并为自己能顺利与社会环境接轨做准备。[实习任务]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通信过程