西电网络程序设计大作业_第1页
西电网络程序设计大作业_第2页
西电网络程序设计大作业_第3页
西电网络程序设计大作业_第4页
西电网络程序设计大作业_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 西安电子科技大学 网络程序设计 实 验 报 告 班 级: 1303013 姓 名: 吴连伟 学 号:西安电子科技大学网络程序设计实验报告2015年度 实验一:1. linux平台上的TCP并发服务 一、实验内容 掌握基本套接字函数使用方法、TCP协议工作原理、并发服务原理和编程方法。实验内容:在linux平台上实现1个TCP并发服务器,至少可以为10个客户端同时提供服务。 (1) 基于TCP套接字编写服务器端程序代码,然后编译和调试; (2) 服务器程序要达到:可以绑定从终端输入的IP地址和端口;可以显示每一个进程的进程号;可以显示当前并发执行的进程数量;可以根据客

2、户机要求的服务时间确定进程的生存时间。 (3) 基于TCP套接字编写客户端程序代码,然后编译和调试; (4) 客户端程序要达到:可以从终端输入服务器的IP地址和端口;可以从终端输入对服务器的服务时间要求。 (5) 联调服务器和客户端,服务器每收到一个连接就新建一个子进程,在子进程中接收客户端的服务时间请求,根据所请求的时间进行延时,然后终止子进程。如:客户端请求服务10s,则服务器的子进程运行10s,然后结束。 (6) 服务器要清除因并发服务而产生的僵尸进程。 二、分析及设计 要实现并发的服务器,也就是要求在同一段时间内,服务器能处理多个不同的客户端的请求,并且要区分出它们各自差别,然后做到区

3、别对待这里只要用各自的进程的fd来区分各自的身份。 不过这里因为水平有限,没有实现各个客户端各自定一个服务时间,服务时间是按照客户端连接到退出的这段时间,也就是要客户端主动退出。 西安电子科技大学网络程序设计实验报告2015年度 三、详细实现 服务器端:负责接收客户端的信息,然后在区分各个客户端的前提下,将信息复述出来。 以下是各种参数的初始定义; 生成服务端进程套接字及初始化; 西安电子科技大学网络程序设计实验报告2015年度 调用bind()和listen()函数来绑定套接字地址和句柄以及坚挺服务请求; select()函数可以设置超时,是长期没有文件描述符就绪时,进程可以跳出阻塞状态;

4、之后的各种情况跳转判断,请看附录的详细代码 客户端: 各种参数以及初始化,因为客户端逻辑功能较少,因此参数的个数也不及服务器端的多; 调用connect()函数,将该套接字和服务器套接字相连接; 从命令行读入信息; 其余代码见附录。 西安电子科技大学网络程序设计实验报告2015年度 四、实验结果 西安电子科技大学网络程序设计实验报告2015年度 实验二:进程间的协调通信 一、实验内容 掌握进程的概念、进程间通信的基本原理、集成间通信的主要类型和各自的特点。实验内容:在linux平台上实现1个父进程、2个子进程,利用管道和共享内存实现两个子进程之间数据快速传送。 (1)创建一个进程,再创建一对管

5、道、一块共享内存(大于64kB); (2)通过fork()函数生成2个子进程; (3)调试程序,确定父、子进程之间可以双向通信; (4)调试程序,确定两个子进程之间可以通过父进程中转实现双向通信; (5)调试程序,确定两个子进程都可访问共享内存; (6)实现两个子进程之间无冲突地访问共享内存。传送的数据块不小于32kB,为了能够看到演示效果,读/写每个字节后都延时0.5ms。 二、分析及设计 管道: 管道又可以分为无名管道和命名管道,两者的用途是不一样的。无名管道PIPE:主要用于具有亲缘关系的进程之间的通信,无名管道的通信是单向的,只能由一段到另外一段;无名管道是临时性的,完成通信后将自动消

6、失。一般采用先创建无名管道,再创建子进程,使子进程继承父进程的管道文件描述符,从而实现父子进程间的通信;在非亲缘关系管道之间,如果想利用无名管道进行通信,则需要借助另外的文件描述符传递机制。 有名管道FIFO:有名管道是一个实际存在的特殊文件,利用有名管道可以实现同主机任意进程之间的数据交互。 这里只需要无名管道,它只能在父子进程间传递信息,因此要求在两个子进程之间通信,必须以父进程为媒介,进程1将信息传给父类,然后由父类将信息传给进程2,以此来完成两子进程的一次通信。 西安电子科技大学网络程序设计实验报告2015年度 共享内存: 通常由一个进程创建,其余进程对这块内存区进行读写。得到共享内存

7、有两种方式:映射/dev/mem设备和内存映像文件。前一种方式不给系统带来额外的开销,但在现实中并不常用,因为它控制存取的是实际的物理内存;常用的方式是通过shmXXX函数族来实现共享内存: 如果一个进程通过fork创建了子进程,则子进程继承父进程的共享内存,既而可以直接对共享内存使用,不过子进程可以自身脱离共享内存。 基于共享内存的通信,不需要父进程的帮助,只要将两个子进程与申请的进程块联系起来即可;主要的问题是两个子进程之间访问共享内存的互斥问题,必须等进程1写完内存后,进程2才能读取,顺序不能乱。这里其实又设计到了进程通信的另一种方式信号量,不过这不是重点,因此只采用了最简单的方式,设置

8、一把锁,然后两个子进程循环检查这个标志锁,然后根据锁来决定是否就可以实现这个功能。 以下是共享内存的原理示意图: 西安电子科技大学网络程序设计实验报告2015年度 三、详细实现 管道: 调用pipe()来生成管道: 调用fork()创建一个子进程,并实现数据写入到父进程中: 其余代码略; 共享内存: 西安电子科技大学网络程序设计实验报告2015年度 定义一个结构体: 创建一个共享内存并且将之连接到当前进程的地址空间: 一个进程负责内存写入:(读进程类似) Process_Write()和Process_Read()代码偏长,详见附录; 西安电子科技大学网络程序设计实验报告2015年度 四、实验

9、结果 管道: 共享内存: 其实可以看到进程间运行还是有些问题,You wrote多次出现。这个问题需要跟完善的信号操作来实现完全的按序执行。 西安电子科技大学网络程序设计实验报告2015年度 实验三:Windows平台上的TCP并发服务 一、实验内容 编程内容与实验1相同,操作系统为windows。了解Windows与Linux平台编程环境的差异,掌握Winsock编程接口及编程方法。 二、分析及设计 Berkeley套接字刚开始时4.2BSD Unix操作系统(与1983年发布)的一套应用程序接口,设计之初就是为了实现TCP/IP协议。Berkeley套接字应用程序接口形成了事实上的网络套接

10、字的标准。 而微软当时为了迅速占据市场以及招聘人才,全盘套用了Unix的网络编程实现,其中就包括了Berkeley套接字。不过由于Unix和Windows的内核实现是有差别的,Berkeley套接字在Windows上的运行效率并不高,因此后来Windows推出了Winsock,并且为了预防AT&T申请专利,它被实现为一个与网络协议无关的网络编程接口。 Winsock的实现一般在Berkeley套接字函数上加了前缀WSA用以区分。 这个实验的具体实现其实和实验1没有实质上的区别,差别在于同样的功能要用不同的函数来实现。 这个程序实现的比较简单,服务器和客户端只有一次交换信息。 三、具体实

11、现(具体阐述与linux的异同) 服务器端: windwows下的socket编程函数库: 各个参数及初始化: 西安电子科技大学网络程序设计实验报告2015年度 不同之处: 同样是bind(),listen(): 其余代码略; 客户端: connect()函数: 使用完函数库,需要释放: 西安电子科技大学网络程序设计实验报告2015年度 四、实现结果 心得体会: 网络程序设计这门课是一门非常非常实用的课,可惜开课的时间不太合适,刚开始时,网络方面的知识实在是非常的欠缺,因此现在看来非常基础的socket,在那时是根本无法理解的,而后来随着课程的推进,各种实验上机接踵而来,也无法抽出时间来好好学

12、习网络编程,浪费了很多时间,这让我感到很可惜,错过了学习这门课的最好时候。 不过在这一段时间的补充学习,我还是追回来一点内容,至少不是两眼一蒙,不会啥都不认识了。Winsock的内容继承了Windows编程的一贯特点,艰涩难懂至少对于还没入门的我是这种感觉的。 强烈希望能够网络程序这门课放到大三下学期! 西安电子科技大学网络程序设计实验报告2015年度 附录: 实验一: 服务器端: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/time.h> #i

13、nclude <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <sys/select.h> #include <errno.h> #define SERVER_IP "127.0.0.1" #define SERVER_PORT 8000 #define MAX_RECV_LEN 1024 /发送信息的最大长度 #define MAX_CLIENT_NUM 30 /并发数量 #define BACK_LOG 20 /等待队

14、列 static int running = 1; int main(int argc, char *argv) int sock_fd = -1; /套接字文件描述符 西安电子科技大学网络程序设计实验报告2015年度 int ret = -1; struct sockaddr_in serv_addr; /服务器地址 struct sockaddr_in cli_addr; /客户端地址 socklen_t serv_addr_len = 0; socklen_t cli_addr_len = 0; int client_fdMAX_CLIENT_NUM; /客户端队列,用于区分各个客户端,

15、并区分服务 char recv_bufMAX_RECV_LEN; /缓冲区 int new_conn_fd = -1; /新进程的fd int i = 0; int max_fd = -1; int num = -1; struct timeval timeout; fd_set read_set; fd_set write_set; fd_set select_read_set; FD_ZERO(&read_set); FD_ZERO(&write_set); FD_ZERO(&select_read_set); for (i = 0; i < MAX_CLIE

16、NT_NUM; i+) client_fdi = -1; /初始化 memset(&serv_addr, 0, sizeof(serv_addr); /初始化 memset(&cli_addr, 0, sizeof(cli_addr); 西安电子科技大学网络程序设计实验报告2015年度 sock_fd = socket(AF_INET, SOCK_STREAM, 0); /生成TCP/IP协议的套接字 if (sock_fd < 0) perror("Fail to socket"); /套接字生成失败 exit(1); serv_addr.sin_family = AF_INET; /TCP/IP协议族 serv_addr.sin_port = htons(SERVER_PORT); /端口号,8000 serv_addr.sin_addr.s_addr = inet_addr(SERVER_IP); /格式化(本地)IP地址 unsigned int value = 1; if (setsockopt(sock_fd, SOL_SOCKET, SO_REU

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论