《计算机网络》课程实验报告 实验二:Socket通信编程
姓名 计605 出勤、表现得分(10) 操作结果得分(50) 院系 钱权,张瑞,袁世忠 计算机学院 指导教师 实验时间 实验报告 得分(40) 学号 张瑞 周五5-6节 实验总分 任课教师 实验地点 实验课表现 实验目的: 1. 掌握Socket编程过程; 2. 编写简单的网络应用程序。 实验内容: 利用你选择的任何一个编程语言,分别基于TCP 和UDP 编写一个简单的Client/Server 网络应用程序。具体程序要求参见《实验指导书》。 要求以附件形式给出: ? 系统概述:运行环境、编译、使用方法、实现环境、程序文件列表等; ? 主要数据结构; ? 主要算法描述; ? 用户使用手册; ? 程序源代码; 实验要求:(学生对预习要求的回答)(10分) ? Socket编程客户端的主要步骤 1、用socket()函数创建socket 2、设置目标服务器的IP地址和端口号 3、用connect()函数,与目标服务器连接 4、用Send()函数发送数据,recv()函数接收数据 5、关闭socket ? Socket编程服务器端的主要步骤 1、用socket()函数创建socket 2、用Bind() 函数将 socket 与本机上的一个端口相关联 3、用Listen() 函数使 socket 处于监听模式 4、用accept()函数让服务器接收客户的连接请求 5、用Send()函数发送数据,recv()函数接收数据 6、关闭socket 实验过程中遇到的问题如何解决的?(10分) 得分: 得分: - 1 -
问题1: 设置IP地址时,刚开始设置成自己的本机的IP地址,但是将程序放到另一台电脑上时就需要修改IP地址。后来将IP地址设置成127.0.0.1就解决了这一问题。127.0.0.1是回送地址,指本地机,这样就不用改变本机地址了。 问题2: 做完基于TCP的Client/Server 编程后,在做基于UDP的编程的时候,以为在TCP的基础上,只要去掉连接服务器、监听、接受连接请求这些步骤就可以,结果无法实现自己想要的效果。后来发现UDP还有一些地方与TCP的不同,比如发送、接收数据的函数是sendto()、 recvfrom(),而不是send()、recv(),仔细查看课UDP的相关资料后也就实现了这一程序。 本次实验的体会(结论)(10分) 得分: 这次SOCKET编程一开始觉得无从下手,在网上找了好多资料才了解了socket的用法,仔细研究了之后发现只要掌握了客户端和服务端各自的运行规律,编写程序意外的简单。通过这次实验我明白了看问题一定要看本质,不能被看似很难的问题吓到。我一定会再接再厉,争取做好每一次实验。 思考题:(10分) 思考题1:(4分) 得分: 你所用的编程语言在Socket通信中用到的主要类及其主要作用。 1. socket 类:用于服务器端程序和客户端程序,实现双方的数据通信。 2. SOCKADDR_IN结构:记录端口地址、IP地址、协议族等信息。 思考题2:(6分) 得分: 说明TCP和UDP编程的主要差异和特点。 TCP和UDP是Socket的两种主要操作方式:面向连接的和无连接的。 无连接的操作使用UDP数据报协议,这个操作不需要连接一个目的的socket,它只是简单地投出数据报,快速高效,但缺少数据安全性。 而面向连接的操作使用TCP协议,一个这个模式的socket必须在发送数据之前与目的地的socket取得一个连接,一旦连接建立了,socket就可以使用一个流接口:打开-读-写-关闭,所有的发送的信息都会在另一端以同样的顺序被接收,面向连接的操作比无连接的操作效率要低,但数据的安全性更高。 基于TCP的socket编程是采用的流式套接字(SOCK_STREAM)。基于UDP采用的数据报套接字(SOCK_DGRAM).流式套接字的设计是针对面向连接的网络应用,在数据传输之前需要预先建立连接,在数据传输过程中需要维持连接,在数据传输结束后需要释放连接。由于采用校验和、确认与超时等差错控制手段,因 此流式套接字可以保证数据传输的正确性。 数据报套接字(SOCK_DGRAM)提供无连接的、不可靠的数据传输服务,实际上它是基于TCP/IP协议族中的UDP协议实现的。数据报套接字提供无序、有差错与有重复的数据- 2 -
流服务。数据报套接字的设计是针对无连接的网络应用,在数据传输之前不需要预先建立连接。由于只采用很有限的差错控制手段,因此数据报套接字无法保证数据传输的正确性。 所以TCP面向连接,安全可靠,而UDP面向数据,数据可能会丢失,但是高效,结构简单,网络开销小。 指导教师评语: 日期: - 3 -
附件:
(一) 系统概述
1. 运行环境:windowXP、win7等操作系统 2. 编译:已编译完成,可直接执行可执行文件 3. 实现环境:Visual Studio 2010
4. 使用方法:一般窗口应用程序,双击即可运行。(用户名:aaa 密码:123) (二) 主要数据结构 服务器端程序:
1. Class CClientNet { public: //连接上指定服务器 int Connect(int port,const char* address); //发送信息 //int SendMsg(const char* msg,int len); void SendMsg(); //关闭 Void Close(); private: SOCKET m_sock; }
2. SOCKET 3. WSAData 4. sockaddr_in 客户端程序:
1. class CServerNet {
public: //初始化服务器,返回0表示成功 int Init(const char* address,int port); //更新数据 void Run(); private: SOCKET m_sock; }
2. SOCKET 3. WSAData 4. sockaddr_in (三) 用户使用手册
1. 运行服务器端程序server.exe。 2. 运行客户端程序client.exe。
3. 用户登录:在客户端界面中出现connect则说明可以与服务器连接。在login:后输入用户名(aaa),若用户名存在则client端返回该用户名的密码(123),与输入密码比对,若相同则连接成功,可以开始发送消息。
4. 发送消息:在步骤3后,用户端界面会出现“send your message:”的提示,此时可以
i
输入想要发送的消息,输完后按enter键发送。若发送成功,则server界面出现发送的消息,client界面提示“send successfully”。
5. 退出连接:输入exit并按enter键断开与服务器的连接,服务器端界面和客户端界面同时提示“exit\\n close”。
(四) 算法分析
Client Server
(五) ? 程序源代码
A. TCP
①. Client端 #pragma once
#include
ii