计算机网络实验题目:Socket编程实验1基于UDP的Socket编程实验2基于TCP的Socket编程姓名:学号:学院:年级:实验时间:目录一、实验内容:...............................................................................................................................3实验1基于UDP的Socket编程...........................................................................................3实验2基于TCP的Socket编程............................................................................................3二、程序设计.................................................................................................................................31基于UDP的Socket编程..................................................................................................31.1实验原理:基于UDP协议的无连接C/S的工作流程..........................................31.2实现方案和实验结果................................................................................................41.2.1方案1:Linux上两个进程间的通信...................................................................4方案1实现方案.......................................................................................................4方案1实验结果.......................................................................................................41.2.2方案2:Windows主机(client)和Linux虚拟机(server)之间的进程通信6方案2实现方案.......................................................................................................6方案2实验结果.......................................................................................................62基于TCP的Socket编程...................................................................................................72.1实验原理:基于TCP协议的面向C/S的工作流程...............................................72.2实现方案....................................................................................................................82.3实验结果....................................................................................................................9三、讨论与心得.............................................................................................................................10四、源代码.....................................................................................................................................12一、实验内容:本单元实验包括的实验项目主要是UDPSocket编程和TCPSocket编程。本单元实验的主要目的是希望通过本单元实验,让学员掌握Socket编程方法,同时通过本单元实验让学生掌握如何开发基于TCP/IP协议的网络应用。实验1基于UDP的Socket编程实验目的:通过本实验使学员了解和掌握编写基于UDP协议的网络应用程序。实验内容:编写基于UDP协议网络聊天程序,要求发送程序和接收程序能够接收键盘输入并彼此之间相互发送数据。实验步骤:1.编写server端程序;2.编写client端程序;3.client程序与server程序联调;4.client程序与server程序相互通信。实验2基于TCP的Socket编程实验目的:通过本实验使学员了解和掌握编写基于TCP协议的网络应用程序。实验内容:编写基于TCP协议网络聊天程序,要求发送程序和接收程序能够接收键盘输入并彼此之间相互发送数据。实验步骤同UDP实验。二、程序设计1基于UDP的Socket编程1.1实验原理:基于UDP协议的无连接C/S的工作流程在server端,server首先启动,调用socket()创建套接字,然后调用bind()绑定server的地址(IP+port),调用recvfrom()等待接收数据。在client端,先调用socket()创建套接字,调用sendto()向server发送数据。server接收到client发来数据后,调用sendto()向client发送应答数据,client调用recv接收server发来的应答数据。数据传输结束,server和client通过调用close()关闭套接字。原理图如图1。图1UDP通信原理图1.2实现方案和实验结果1.2.1方案1:Linux上两个进程间的通信方案1实现方案server端:首先调用socket函数创建一个socket,然后调用bind函数将其与本机地址以及一个本地端口号绑定,用recvfrom函数接收到一个client端的消息后,用printf打印出来,server从标准输入设备中取得一行字符串后,调用sendto函数发送给client端。最后用close关闭该socket。client机端:首先调用socket函数创建一个socket,初始化server地址及端口号(实际上就是本机),从标准输入设备中取得字符串,用sendto传送给server端,然后用recv函数接收server端发来的字符串,用printf打印出来。最后用close关闭该socket。源代码见附录。方案1实验结果server和client通信截图图2UDPserver图3UDPClient1.2.2方案2:Windows主机(client)和Linux虚拟机(server)之间的进程通信方案2实现方案利用Vmwarestation的Linux虚拟机与Windows本机之间的局域网进行进程间通信,Linux虚拟机作为server,Windows本机作为client。除了Windows使用winsock函数库之外,实现方案与方案1类似,但要注意client端初始化的server地址虽然与方案1相同,但此时已不再是本机地址,而是局域网中Linux虚拟机的IP地址,相当于模拟了不同机器间的进程通信。方案2实验结果server和client通信截图图4server图5client2基于TCP的Socket编程2.1实验原理:基于TCP协议的面向C/S的工作流程在server端,server首先启动,调用socket()创建套接字;然后调用bind()绑定server的地址(IP+port);再调用listen()让server做好侦听准备,并规定好请求队列长度,然后server进入阻塞状态,等待client的连接请求;最后通过accept()来接收连接请求,并获得client的地址。当accpet接收到一个client发来的connet请求时,将生成一个新的socket,用于传输数据。在client端,client在创建套接字并指定client的socket地址,然后就调用connect()和server建立连接。一旦连接建立成功,client和server之间就可以通过调用recv和send来接收和发送数据。一旦数据传输结束,server和client通过调用close()来关闭套接字。原理图如图6。图62.2实现方案server端:首先调用socket函数创建一个Socket,然后调用bind函数将其与本机地址以及一个本地端口号绑定,然后调用listen在相应的socket上监听client,当accpet接收到一个client发来的connet请求时,将生成一个新的socket,用于传输数据。Recv()接收到一个client端的消息后,server从标准输入设备中取得一行字符串,调用send()发送给client端。client端:首先调用socket函数创建一个Socket,初始化server地址及端口号,然后调用connet请求连接监听server。通过server端accept函数生成的新socket,调用send函数向server端发送从标准输入设备中取得的字符串,然后用recv接收server端发来的字符串。最后用close()关闭该数据传输socket和监听socket。源代码见附录。2.3实验结果server和client通信截图图7TCPserver图8TCPserver三、讨论与心得记得助教第一节课讲socket的时候,我听得云里雾里的,只觉得是个很神奇的可以实现进程间通信的类似于接口的东西。印象深刻的是他举的那个打电话的例子,描述得很直观形象。老师说让我们做这个实验主要是为了体会TCP/IP的原理,并不要求应用做得多么高端,比如图形界面什么的。我觉得,我既然是网络工程专业的,就更应该学好计算机网络这门课,更好地了解socket编程。抱着这种决心,我开始了学习。于是我先去网上找了有关socket编程的讲解,觉得一篇《一切皆socket》的帖子写得很易懂,对于各个函数的功能有了初步的了解。操作系统的课程也有一个做shell命令解释器的实验,与socket编程实验基本是先后进行的。在做了shell,熟悉了“一切皆文件”的linux以及编译、运行的方法之后,感觉跟好理解,更好入手了。我先对照着《一切皆socket》的帖子看老师给的资料附录一中的示例一、二,也就是TCP。原来socket()是用来创建一个,然后返回值是这个socket的描述符,很类似与文件描述符。bind()是用来为这个socket绑定server的IP+port地址,当然绑定之前要先对server的地址进行初始化。listen()的作用是监听client的请求,第二个参数规