网络编程实验指导书
《网络编程技术实习》指导书
《网络编程技术实习》指导书一、教学目的通过本次课程实习,使学生进一步理解、领会C++语言和网络编程技术,把所学的知识运用到具体的程序设计当中去,编写一个接近实际的应用程序。
本课程实习是一门综合性实验。
通过本次课程实习/实习,掌握VC++应用程序设计;加深对TCP/IP协议的理解;掌握C/S编程模式;掌握Socket机制、传输控制协议;用户数据报协议;掌握网络抓包的原理;掌握网络编程应用程序分析、设计、编程和调试的整个过程。
二、设备及工具硬件:微机70台以上,P4以上处理器,256M以上内存、Ethernet网卡,交换机软件:Windows2000/xp操作系统,VC6.0编程环境。
三、网络编程技术实习课题选题一览表各位同学请在上述列表中选择课题,并按课题要求独立完成该课题,禁止抄袭与复制。
四、课程实习/实习过程与具体要求1. 学习课程实习指导书学习研究课程实习指导书。
2. 确定目标、初步方案,准备、试用开发环境与工具选题并确定课题目标及初步方案;选择、准备、试用开发平台及其他有关开发工具。
3. 学习与搜集素材,借阅、购置必要的书籍与材料利用各种途径(图书馆、因特网、书店、同学亲友等)进行针对性的学习并收集相关素材,包括精选、购置必要的书籍。
4. 课堂与课下结合开发项目因为需要自学和探索的内容较多,每个学生要特别发挥积极主动精神投入课程实习和开发活动。
除了实验室正式安排的课程实习时间之外,学生需要充分利用好课余时间,自己有计算机的学生更要充分利用有利条件以取得尽可能好的开发成果,力争获得最大收益。
5. 各阶段的开发工作开发过程中,相同或相近课题的同学可以进行相互讨论,并做好讨论记录,但开发的程序代码以及相关文档不得相互借用或相互复制。
讨论的可能内容可以是:1) 选题、开发方案研讨。
2) 搜集、查阅资料。
3) 系统的分析与设计。
4) 程序模块了的工作流程。
5) 完成测试,整理开发文档、汇总。
6. 做好开发记录、总结建议每位同学建立自己个人的开发记录或日志。
Java程序设计网络编程实验指导书
Java程序设计与网络编程实验指导书一.实验教学目的、内容和要求1、实验教学目的Java语言及网络编程实验是将课程教学中所讲授知识与实践相联系的重要环节,通过实验加深学生对所学知识的理解和认识,增强实践能力。
促进学生熟悉Java语言的语法,培养面向对象的程序设计的设计思路,初步掌握利用Java平台开发简单应用程序以及网络应用程序等的能力,为以后进一步学习和工作打好基础。
二、实验内容、要求、步骤及代码和实验总结:实验项目一:熟悉Java基本编程实验时间:4.5实验要求:1)掌握JDK的安装及配置方法;2)熟悉Java程序的基本结构和Java的基本语句;3)并掌握其编辑、编译、运行方法。
实验步骤:1. 网上下载JDK;2. 安装JDK3. 设置环境变量。
4.安装UltraEdit 编写程序的工具5.Java程序示例代码//例1-1,1-2,1-3写出来。
实验总结:1.Java程序安装JDK中包含有JRE运行环境,JDK安装目录应在Path中设置2. Java是纯类的编程,main 函数也是定义在公共类中。
公共类与程序名相同。
实验项目二:Java面向对象技术编程实验时间:4.24实验要求:1)掌握类和方法定义的基本方法;2)掌握Java的面向对象程序的基本编制和调试方法。
3)尽量用到继承、接口、上转型对象和包等技术,来求解几何图形的周长面积。
实验步骤:1.定义一个图形接口,定义求图形面积,周长和图形名称的抽象方法。
2.定义一个点的类,包含两个坐标。
3.定义一个抽象图象显示类,包含面积、周长和名称成员,和构造函数、输出函数。
4.具体的几何图形类如三角形、圆和长方形实现图形接口中的抽象方法。
5.定义一个图形Drawing类继承图象显示类,把某个图形的面积、周长和名称作实参传过来,即可定义其图形Drawing类的一个对象,再调用输出函数,可把该图形的面积、周长和名称输出。
//将P116 页例5.8简单案例中的某一个图形的代码写出来。
网络编程设计实验指导书范文
实验一 JavaEE初级编程(2 学时)1、实验目的(1)掌握Java程序运行环境的安装与配置。
(2)掌握Tomcat服务器的安装及环境配置方法。
(3)掌握对MyEclipse的集成开发环境的配置,为Java EE程序的实验做好准备工作。
(4)掌握编写与运行JSP程序的方法。
(5)掌握JSP语言的基本编程方法,了解JSP中各种元素及标签的使用。
2、基本要求:(1)注意自始至终贯彻课程中所介绍程序设计风格,养成良好的编程习惯。
(2)独立完成所布置习题。
(3)为保证尽量在统一安排的上机时间内编译运行通过程序,应事先设计好程序。
(4)认真完成每次实验,并写出实验报告。
3、实验内容和步骤:(1)安装JDK软件包。
(2)设置环境变量,包括设置Java的运行路径和classpath。
(3)安装tomcat服务器,并了解服务器的文件结构。
(4)安装MyEclipse,学会在该环境中如何配置Tomcat服务器,完成Java EE项目的部署及运行。
(5)建立一个项目user,在其中首先创建一个注册页面,要求在注册页面中输入用户注册信息,如果注册成功,则给出成功提示,如果注册失败,则将页面返回到注册页面,并给出错误提示。
●建立一个SQLServer数据库Test,在其中建立数据表user,表中包含用户注册时所需要的各种信息字段,包括username,password,sex,age,hobby等,并向其中输入几条用户信息。
●建立一个JSP 注册页面regist.jsp,⏹在其中通过form表单输入注册所需要的用户名称userName,用户密码userPassword,重复密码RUserPassword,用户性别userSex及年龄userAge还有用复选框表示的用户爱好hobby等信息,⏹输入信息之后通过点击提交按钮submit,将这些信息提交到另一个regist_User.jsp页面。
●在regist_User.jsp页面中完成数据库的验证,根据验证结果给出提示,并转到相应的处理页面。
网络编程技术实验指导书之实验一.docx
《网络编程技术》实验指导书2015 版(网络工程专业)山东建筑大学计算机科学与技术学院网络工程教研室袁卫华实验一Java I/O和Java线程应用一、实验目的熟悉java运行环境,编程常握Java输入输出流和Java线程的应用。
二、实验环境一般微机即可,软件MyEclipse, JDK 1.5以上版本即可。
三、实验内容1)搭建java运行环境2)Java 10流的用法3)Java线程四、实验步骤1.完成以下程序。
第一题:利用Jam输入输出流编程实现计算器。
功能:(1)先输入第一•组操作数,并将其存放在一个文件中。
(2)然后输入第二组操作数,并将其存放在第二个文件中。
(3)选择一•种加减乘除运算。
(4)从第一个文件中取第一个操作数,从第二个文件中取第二个操作数,将其按照第三步中选择的运算做加减乘除后存入到第三个文件中。
(5)从第三个文件中读取出运算结果。
其他要求:(1)要求处理double型或float型数据。
(2)能够处理程序运行结果中的各种异常。
提示:♦程序运行截图请输入您要选择的操作(请输入中的任一数字):1:输入第一组操作数;2:输入第二组操作数;3:进行运算;4:退出系统;图1程序主界面开始向文件1中输入第一组数字:请输入操作数(输入己n 遐ENC 结束输入):12请输入操作数(输入己n 遐ENC 结束输入):21请输入操作数(输入己n 遐ENC 结束输入):33请输入操作数(输入己n 遐ENC 结束输入):saf数字格式不对!请输入操作数(输入己n 遐ENC 结束输入): end图2输入第一组操作数操作界面2开始向文件2中输入第二组数字:请输入操作数(输入结束输入):1请输入操作数(输入结束输入):2请输入操作数(输入结束输入):3请输入操作数(输入结束输入):4请输入操作数(输入结束输入):end图3输入第二组操作数操作界面请输入您要执行的加减乘除运算(请输入1 - - 5中的任一数宇) 1: 2: 3: 图4主界面中选择3进入加减乘除操作选择界面加减乘除返请输入您要执行的加减乘除运算(请输入中的任一数字):1:加法;2:减法;3:乘法;4:除法;5:返回上一级;图5加法运算结束后从文件3中读出的运算结果注意:红色框线所标注的为此次运算结果,也可以每次只存储并本次操作的 运算结果,这取决于FileOutputStream 构造方法的格式。
《网络编程》实验指导书8
《网络协议及编程》实验指导书实验八FTP客户端开发实验目的:学习使用MFC WinInet类编程,实现FTP客户端。
实验要求:每人独立完成。
实验说明:WinInet是Windows Internet扩展应用程序高级编程接口,是专为开发具有Internet功能的客户端应用程序而提供的,支持FTP、HTTP、Gopher协议。
使用WinInet,用户的应用程序可以轻松地与这3种Internet服务器建立连接,无需考虑通信协议的细节和底层的数据传输。
WinInet有两种形式:(1)WinInet API包含一个C语言的函数集(Win32 Internet functions),(2)MFC WinInet类层次则是对前者的面向对象的封装。
但直接利用WinInet API函数还是不太容易,这些函数都是利用头文件和库函数形式提供的,理解和掌握有一定难度。
使用WinInet类编程的一般步骤:(1)创建CInternetSession类对象,创建并初始化Internet会话。
(2)利用CInternetSession类的QueryOption或SetOption成员函数,可以查询或设置该类内含的Internet请求选项,这一步是可选。
(3)创建连接类对象,建立CInternetSession对象与网络服务器的连接,也就是应用程序与网络服务器的连接。
(4)创建文件检索类对象,对服务器进行检索。
(5)如果需要使用异步操作模式,可以重载CInternetSession类的OnStatusCallback函数,并启动应用程序使用状态回调机制。
重载相关函数,加入自己的代码。
(6)如果还想更紧密地控制对于服务器文件的访问,可以进一步创建文件类对象实例,完成文件查找或文件读写操作。
(7)创建CInternetException类对象实例,处理错误。
(8)关闭各种类,将资源释放给系统。
实验参考步骤:1.新建工程。
工程类型选“MFC AppWizard(exe)”,输入工程名称,选取工程存储位置,“下一步”,选择Dialog based应用程序类型,其它部分接受系统的默认设置就可以。
网络编程作业指导书
网络编程作业指导书一、作业要求本次作业旨在让学生通过实践掌握网络编程的基本概念和技术,并能够独立完成一些网络应用程序的开发。
具体要求如下:1. 使用Java语言实现一个简单的TCP客户端/服务器模型;2. 客户端能够与服务器建立连接,并发送消息给服务器;3. 服务器能够接收客户端的消息,并返回相应的响应;4. 客户端能够接收服务器的响应,并将其打印输出。
二、环境要求为了顺利完成本次作业,学生需要准备以下环境:1. JDK(Java Development Kit):确保电脑上已经安装了JDK,并且配置了相应的环境变量;2. 编程工具:可以使用任何你熟悉的Java编程工具,推荐使用Eclipse或IntelliJ IDEA。
三、作业步骤下面将按照一步一步的方式指导学生完成作业。
1. 客户端代码实现首先,在你选择的编程工具中创建一个新的Java项目,并创建一个名为Client的Java类。
在Client类中,你需要实现以下几个方法:```javapublic static void main(String[] args) {// 创建一个Socket对象并指定服务器的IP地址和端口号Socket socket = new Socket("服务器IP地址", 服务器端口号);try {// 获取Socket的输出流并初始化PrintWriter对象PrintWriter out = new PrintWriter(socket.getOutputStream(), true);// 向服务器发送消息out.println("Hello, Server!");// 获取Socket的输入流并初始化BufferedReader对象BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));// 读取服务器的响应并输出System.out.println("服务器响应:" + in.readLine());// 关闭连接socket.close();} catch (IOException e) {e.printStackTrace();}}```2. 服务器端代码实现接下来,创建一个名为Server的Java类,并在其中实现以下几个方法:```javapublic static void main(String[] args) {try {// 创建一个ServerSocket对象并指定监听的端口号ServerSocket serverSocket = new ServerSocket(服务器端口号);// 等待客户端的连接Socket clientSocket = serverSocket.accept();// 获取客户端的输入流并初始化BufferedReader对象BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));// 获取客户端的输出流并初始化PrintWriter对象PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);// 读取客户端的消息并输出System.out.println("客户端消息:" + in.readLine());// 向客户端发送响应out.println("Hello, Client!");// 关闭连接serverSocket.close();} catch (IOException e) {e.printStackTrace();}}```3. 运行和测试打开两个命令行窗口,一个用于运行客户端程序,另一个用于运行服务器程序。
《网络编程技术》实验指导书
《网络编程技术》实验指导书Last updated: 4/27/2022《计算机网络》课程设计--协议设计与编码实现指导书1实验1. Windows平台简单套接字编程实验类型:设计性一、实验环境操作系统:Windows编程工具及集成开发环境:VC++二、实验目的和要求实验目的:掌握Windows平台上简单的客户机端和服务器端的套接字编程。
实验要求:(1)在Windows上,编写、编译1个客户机端程序和1个服务器端程序。
要求客户机端程序能发送请求给服务器端程序,服务器端程序收到后能发送本机时间给客户机端程序。
客户机 服务器端服务器端=====时间===》客户机(2)在相同或不同机子上,先运行服务器端程序可执行文件,后运行客户机端程序可执行文件。
TCP/UDP赋予每个服务一个唯一的协议端口号。
服务器程序通过协议端口号来指定它所提供的服务,然后被动地等待通信。
客户在发送连接请求时,必须说明服务器程序运行主机的IP地址和协议端口号来指定它所希望的服务。
服务器端计算机通过此端口号将收到的请求转向正确的服务器程序。
大多数网络编程语言都提供或者使用控件封装了套接字应用程序接口(Socket API),应用程序通过套接字接口调用来实现和传输层交互。
用户目前可以使用两种套接口,即流套接字TCP和数据报套接字UDP。
流式套接字定义了一种可靠的面向连接的服务,提供了双向的,有序的,无重复的数据流服务。
数据报套接字定义了一种无连接的服务,支持双向的数据流,但并不保证是可靠,有序,无重复的。
也就是说,一个从数据报套接字接收信息的进程有可能发现信息重复了,或者和发出时的顺序不同。
套节字API主要包括表1所示的接口。
(套接字API)使用面向连接的套接字编程,通过图2来表示其时序。
套接字工作过程如下:服务器首先启动,通过调用socket()建立一个套接字,然后调用bind()将该套接字和本地网络地址联系在一起,再调用listen()使套接字做好侦听的准备,并规定它的请求队列的长度,之后就调用accept()来接收连接。
网络编程技术实验指导书
网络编程技术实验指导书李笑平编淮阴工学院计算机工程学院2010年1月目录实验1:基于NetBIOS的网络通信程序设计 (1)实验2:基于socket的简单网络程序设计 (2)实验3:流式套接字程序设计 (10)实验4:数据报式套接字程序设计 (12)实验5:原始套接字程序设计 (15)实验6:基于WinPcap的程序开发 (18)实验7:基于CAsyncSocket类网络通信程序设计 (34)实验1:基于NetBIOS的网络通信程序设计1 实验目的与要求掌握NetBIOS方式的网络编程模式。
理解并能应用NetBIOS实现C/S会话通信程序设计。
2 实验设备与实验环境连接到互联网上的IBM PC机两台。
计算机硬件要求:Intel Pentium5 处理器、256MB以上内存,Ethernet网卡,网线若干。
计算机软件要求:MS Windows 9x/2000/XP操作系统,TCP/IP协议,Visual c++6.0/.net 系统。
3 实验内容与步骤利用NetBIOS编写C/S会话通信程序以实现如下程序设计要求,客户端与服务器建立会话连接之后,客户端向服务器发送一个简单的四则算式(只含一个算符),服务器收到这个算式后,对其进行计算,并将计算结果回送给客户端,客户端将计算结果显示出来。
注意:整个程序执行过程要求是基于NetBIOS命令实现的。
程序的详细设计过程可参考教材。
实践题1)在完成上面这个实验的基础上,将服务器和客户端分别放在两台不同的机器上进行测试。
2)在以上程序的基础上进行改进,使服务器能提供对复杂四则算式的求值服务。
即客户端发送一个复杂的四则算式,服务器收到此算式后对其求值并将结果回送给客户端。
4 实验小结1)要求理解掌握NetBIOS的工作原理。
5 实验报告本次交实验报告,内容包括:1>实验目的与要求;2>实验设备与实验环境;3>实验内容与实验步骤(实验步骤、源代码);4>实验心得(可以是实验总结、难点讨论、意见建议等)。
网络程序课程设计——实验指导书
目录任务一TCP协议开发(服务器、客户端设计) (1)任务二UDP协议开发(服务器、客户端设计) (3)任务三FTP协议开发(服务器、客户端设计) (4)任务四基于SMTP和POP3协议的EMAIL收发软件 (8)任务一TCP协议开发(服务器、客户端设计)一、任务目的1.熟悉Windows Socket的常用函数的形式和使用方法,理解数据通信的过程。
2.掌握如何利用C#进行TCP协议开发,完成基于TCP的局域网即时消息系统的客户端和服务器端的设计与实现。
二、任务器材1.计算机一台;2.Visual Studio 2008工具软件;三、任务内容1.Winsock的启动与终止。
2.Winsock的创建及绑定和关闭。
3.建立通信连接listen及accept和connect。
4.数据的传输。
5.简单的客户机/服务器之间的通信。
四、任务步骤在TCP/IP网络中两个进程间的相互作用的主机模式是客户机/服务器模式(Client/Server model)。
该模式的建立基于以下两点:(1)非对等作用;(2)通信完全是异步的。
客户机/服务器模式在操作过程中采取的是主动请示方式:1、首先服务器方要先启动,并根据请示提供相应服务,其过程如下:(1)打开一通信通道并告知本地主机,它愿意在某一个公认地址上接收客户请求。
(2)等待客户请求到达该端口。
(3)接收到重复服务请求,处理该请求并发送应答信号。
(4)返回第二步,等待另一客户请求(5)关闭服务器。
2、客户方:(1)打开一通信通道,并连接到服务器所在主机的特定端口。
(2)向服务器发送服务请求报文,等待并接收应答;继续提出请求……(3)请求结束后关闭通信通道并终止。
3、TCP连接的套接字的系统调用时序图如图2.1所示。
4、TCP连接的应用程序流程图如图2.2所示。
五、任务报告要求见《课程设计报告》图2.1 TCP连接的套接字的系统调用时序图图2.2 TCP连接的应用程序流程图六、参考代码一、任务目的1.熟悉C#的UdpClient类的常用函数的形式和使用方法,理解UDP数据通信的过程。
《网络编程技术》实验指导书--学生版
《网络程序设计》课程设计指导书潘超实验一SOCKET基本编程1、实验目的1、掌握使用LINUX环境下GCC编译器的基本方法;2、掌握SOCKET套接字的基本编程模板;3、掌握套接字基本编程,掌握点分十进制和网络二进制IP地址之间的转换。
4、通过使用gethostbyname和gethostbyaddr来获取本地和远程用户的地址信息。
2、实验要求1、认真阅读和掌握本实验相关的知识点。
2、上机编写运行本程序。
3、保存和打印出程序的运行结果,并结合程序进行分析。
3、注意事项:在LINUX系统上为每个用户创建一个目录,专门用于编译和运行实验程序。
实验二服务器与单客户的连接处理1、实验目的1.掌握单用户客户端跟服务器的连接和数据交互及处理。
2、实验要求1.认真阅读和掌握本实验的相关知识点。
2.上机编写并运行本程序。
3.保存和打印出程序的运行结果,并结合程序进行分析。
3、实验内容客户端:1.从命令行读入服务器的IP地址;并连接到服务器;2.循环从命令行读入一行字符串,并传递给服务器,由服务器对字符串反转,并将结果返回客户程序;3.客户程序显示反转后的字符串;服务器端:4.接收客户的连接请求,并显示客户的IP地址和端口号;5.接收客户传来的字符串,反转后传递给客户;1、实验目的1.掌握多进程服务器的知识。
2.掌握多进程程序的编写方法。
2、实验要求1.认真阅读和掌握本实验的相关知识点。
2.上机编写并运行程序。
3.保存和打印出程序的运行结果,并结合程序进行分析。
3、实验内容1、服务器等待客户连接,连接成功后向客户发送欢迎信息,接着接收该客户的名字并显示,然后接收来自客户的信息(字符串),将该字符串反转,并将结果送回客户。
要求服务器具有同时处理多个客户的能力。
2、客户首先与服务器连接,接着接收用户输入客户的名字,将该名字发送给服务器,然后接收用户输入的字符串,并发送给服务器,然后接收服务器返回的经处理后的字符串,并显示之。
网络编程-PING程序设计实验指导书
网络编程-PING程序设计实验指导书一.实验目的(1)熟悉原始套接字编程。
(2)了解网络的结构。
(3)了解网络传输底层协议。
二.实验要求PING程序是用于测试网络连通性的程序。
要求在WINDOWS环境下实现基本的PING程序功能.在命令提示符下输入:PING ***.***.***.***其中***为目的主机的IP地址,不要求支持域名,对是否带有开关变量也不做要求。
不带开关变量时,要求返回4次响应。
返回信息的格式:REPLY FROM ***.***.***.***或REQUEST TimeOut (无法PING通的情况)三.实验原理1、PING的工作原理ping 程序是用来探测主机到主机之间是否可通信,如果不能ping到某台主机,表明不能和这台主机建立连接。
ping 使用的是ICMP协议,它发送ICMP回送请求消息给目的主机。
ICMP协议规定:目的主机必须返回ICMP回送应答消息给源主机。
如果源主机在一定时间内收到应答,则认为主机可达。
ICMP协议通过IP协议发送的,IP协议是一种无连接的,不可靠的数据包协议。
因此,保证数据送达的工作应该由其他的模块来完成。
其中一个重要的模块就是ICMP(网络控制报文)协议。
当传送IP数据包发生错误--比如主机不可达,路由不可达等等,ICMP协议将会把错误信息封包,然后传送回给主机。
给主机一个处理错误的机会,这也就是为什么说建立在IP层以上的协议是可能做到安全的原因。
ICMP数据包由8bit的错误类型和8bit的代码和16bit的校验和组成。
而前 16bit就组成了ICMP所要传递的信息。
PING利用ICMP协议包来侦测另一个主机是否可达。
原理是用类型码为0的ICMP发请求,受到请求的主机则用类型码为8的ICMP回应。
ping程序来计算间隔时间,并计算有多少个包被送达。
用户就可以判断网络大致的情况。
2、RAW模式的SOCKET编程PING程序是面向用户的应用程序,该程序使用ICMP的封装机制,通过IP协议来工作。
《网络编程》实验指导书2
《网络协议及编程》实验指导书实验二Ping编程实现实验目的:编程实现ping程序。
实验要求:每人独立完成。
实验说明:Ping使用的是ICMP协议,它同IP协议一样工作在ISO模型的网络层, 它的全称是: Internet Control Message Protocal. 其在网络中的主要作用是:主机探测;路由维护;路由选择;流量控制。
这里用的是它的回送或回送响应。
回送或回送响应我们使用一个ICMPECHO数据包来探测主机地址是否存活,通过简单的发送一个ICMPECHO (Type 8)数据包到目标主机,如果ICMPECHOReply(ICMPtype0)数据包接受到,说明主机是存活状态。
如果没有就可以初步判断主机没有在线。
这种机制就是我们通常所用的ping命令,来检测目标主机是否可以ping到。
回送消息的源地址是回送响应消息的目的地址。
若要形成一个回送响应消息,应该将源和目的地址交换,将类型代码更改为0,重新计算机校验码。
下面是这个报文的格式:+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Type | Code | Checksum |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Identifier | Sequence Number |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Data ...+-+-+-+-+-Type:8代表回送消息;0代表回送响应消息。
Code:0Checksum:16位数据(从ICMP类型开始)的反码和再取反而得。
为计算校验码,校验码域应该为零。
这些零在以后会被校验码取代。
Identifier:如果代码=0,帮助匹配回送和回送响应的代码可以为0。
网络编程实验指导书
《网络编程》课程实验指导书实验七 HTTP协议客户端编程实现1 实验目的与要求掌握浏览web网页的原理,深入理解HTTP原理以及HTML语言的功能,运用流式套接字下载web网页文件,分别用文本方式和浏览器方式打开下载的网页文件。
同时运用ChtmlView类编写浏览器软件。
运用ChtmlView 类开发浏览器程序,比较两者的异同.2、实验内容第一部分:编写并理解程序,利用流式套接字与web服务器建立TCP连接,然后向服务器发送Get命令,接收服务器的内容,把接收到的信息保存在一个文件中,然后打开该文件,观察文件的内容.第二部分: 运用ChtmlView 类开发浏览器程序3 实验原理模拟explorer部分功能,与web 服务器的80端口建立TCP连接,接下来向web服务器发送一Get命令,服务器会把应答信息和web网页的内容传输过来.4、实验步骤编写并调试程序,选择一个web服务器,寻找共IP地址,如:邵阳学院220.170.193.10搜狐119.97.155.2新浪59.175.132.113在程序中填入该web服务器的Ip地址,运行程序,打开接收的文本文件,观察文件的内容。
并在实验报告中填写下述内容。
接收文件的第一部分的应答信息内容是什么?接收文件的第二部分的内容是什么?用ChtmlView类开发浏览器程序有什么特点?主要仪器设备:安装有VC++6.0的PC机。
要求撰写实验报告,填写实验结果。
附录:第一部分的程序如下#pragma comment(lib,"ws2_32.lib")#include <stdio.h>#include <string.h>#include <winsock.h>void main(){WSADATA wsaData;SOCKET s;FILE *fp1;//文件指针SOCKADDR_IN saddr;int result;//整形变量,用于记录接收数据的字节数int port=80;//http服务器的默认端口WSAStartup(MAKEWORD(2,2),&wsaData);s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);//创建TCP套接字saddr.sin_family=AF_INET;saddr.sin_port=htons(port);saddr.sin_addr.S_un.S_addr=inet_addr("220.170.193.10");//的IP地址connect(s,(SOCKADDR*) &saddr, sizeof(saddr));//请求与web 服务器建立TCP连接char sendbuff[400],strB[1025];//定义发送缓冲区和接收缓冲区strcpy(sendbuff,"GET /index.html HTTP/1.1\r\nHost:www.hnsyu.ne t\r\n\r\n");//字符串拷贝send(s,sendbuff,strlen(sendbuff),0);//传送http请求报文fp1=fopen("E:\pp1.html","w");//打开E:\pp.html,把接收报文保存在该文件中result = 1;//以下每次最多只接收1024字节,其中result为接收的字节数while(result>0){strset(strB,' ');result=recv(s,strB,1024,0);//接收http应答报文fwrite(strB,1,result,fp1);//把strB的数据写入fp所指的文件,以1个字节为单位,写入result个字节strB[result]='\0';//为显示在屏幕上,加字符串结束标记printf("%s",strB);//以字符串的形式显示的屏幕上} //实际接收的字节数大于0,继续接收fclose(fp1);//关闭文件closesocket(s);//关闭套接字WSACleanup();//关闭动态链接库}第二部分的操作如下1 建立工程SelfBrowser基于”单文档”, 工具栏样式为:”类似IE”,最后一步的CselfBrowserView基于ChtmlView类2打开资源视图(ResourceView),点击对话框资源(Dialog),再点击IDR_MAINFRAME选项卡,如图所示:剪切“TODO:对话框布局”,在该位置添加一编辑框和命令按钮,把命令按钮的标题改为”浏览”,把编辑框的ID号改为”ID_EDIT_ADDRESS”,如图所示3 点击“建立类向导”出会现如下界面,选定”Select an existing class”后,点击”OK”,出现下面的界面选定CmainFrame类后,点击”select”再点击“确定”后,完成建立类向导的操作。
计算机网络实验指导书(编程)
计算机网络实验指导书1. 计算机网络实验实验1:批处理及DNS-IP转换实现1、实验目的(1)理解掌握常用批处理指令(2)加深对ping tracert等指令的理解(3)掌握并DNS-IP之间的相互转换2、实验设备PC机C++/C#/javaMicrosoft Visual Studio 6.0/ Microsoft V isual Studio 2008/eclipse3、实验要求(1)建立一个批处理文件,实现以下几个功能:将系统时间输出输出系统的版本号(采用循环判断的方式)请求用户输入一个IP地址,tracert这个IP地址,然后将结果输出到指定文件中(2)DNS-IP Converter实现DNS到IP的转换。
(3)提交书面实验报告4、基础知识与实验原理参照批处理命令.txt5、实验步骤按照顺序依次完成两个实验第二个实验的参考代码:实验2:编程实现PING指令1、实验目的(1)理解掌握ping的工作原理(2)加深对ping tracert等指令的理解(3)通过编程语言实现可视化的ping指令2、实验设备PC机C++/C#/javaMicrosoft Visual Studio 6.0/ Microsoft V isual Studio 2008/eclipse3、实验要求(1)编写一个ping指令小工具,实现ping指令各项参数的输出。
(2)提交书面实验报告4、实验步骤在C#中ping指令用到两个库函数,分别为Net 和NetworkInformationPing指令实例代码如下:using System;using ;using workInformation;using System.Text;public static void Main (string[] args){Ping pingSender = new Ping();PingOptions options = new PingOptions();options.DontFragment = true;string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";byte[] buffer = Encoding.ASCII.GetBytes (data);int timeout = 120;PingReply reply = pingSender.Send (args[0], timeout, buffer, options);if (reply.Status == IPStatus.Success){Console.WriteLine ("Address: {0}", reply.Address.ToString ());Console.WriteLine ("RoundTrip time: {0}", reply.RoundtripTime);Console.WriteLine ("Time to live: {0}", reply.Options.Ttl);Console.WriteLine ("Don't fragment: {0}", reply.Options.DontFragment);Console.WriteLine ("Buffer size: {0}", reply.Buffer.Length);}}其中Address 表示的是目标IP地址;RoundTrip time 表示的是往返时间;Time to live 表示的是TTL;Don’t fragment 表示的是有没有分段;Buffer size 表示的是数据包的大小。
网络编程技术实验指导书
《网络编程技术》实验指导书董黎刚信息与电子工程学院浙江工商大学2013-4-28 14:41:00ContentContent (1)课内实验1. Linux平台简单套接字编程 (2)课内实验2. Windows平台简单套接字编程 (4)课内实验3. html网页编程 (5)课内实验4. 客户端Web编程 (6)课内实验5. WinInet编程 (7)课内实验6. 并发套接字编程 (8)课外实验1. MFC编程 (9)课外实验2. MFC WinSock类的编程 (10)课外实验3.服务器端Web编程 (11)课外实验4. HTTP协议应用编程 (12)课外实验5. 电子邮件协议应用编程 (13)课外实验6. 网络综合程序设计 (14)附录1. 程序评分标准 (15)附录2. Linux shell commands (16)附录3. 编程类实验报告参考格式 (18)课内实验1. Linux平台简单套接字编程实验类型:设计性一、实验环境操作系统:Linux编程工具及集成开发环境:gcc, vi或anjuta二、实验目的和要求实验目的:掌握Linux平台上简单的客户机端和服务器端的套接字编程。
实验要求:(1)在Linux上,编写、编译1个客户机端程序和1个服务器端程序。
要求客户机端程序能发送请求给服务器端程序,服务器端程序收到后能发送本机时间给客户机端程序。
(2)在相同或不同机子上,先运行服务器端程序可执行文件,后运行客户机端程序可执行文件。
可选内容:(1)编写聊天程序,即客户机端程序和服务器端程序之间都能够多次发送消息给对方,也能够多次接收对方发送的消息。
(2)编写TCP和UDP两种程序。
三、实验提示(1)从/dlg/HomeTeaching_files/download/source_code/socket/v3.linux.dist.tar.Z可以下载可供参考的程序。
解压采用“zcat v3.linux.dist.tar.Z | tar xvf –”。
网络编程实验教学大纲
《网络编程实验》课程实验教学大纲课程名称:网络编程实验(Network Programing Experiment)课程编码:课程负责人:刘淼课程性质:独立设课课程属性:专业实验课学时学分:总学时 16 总学分 0.5 实验学时 16 实验学分 0.5开出时间:四年级上学期适用专业:网络工程专业综合性、设计性实验项目数: 1 个,总学时: 6 其中课内学时: 6 课外学时: 0主笔人:刘淼审核人:批准人:课程名称:网络编程实验(Network Programing Experiment)课程编码:课程负责人:刘淼课程性质:独立设课开设学期:学时学分:课程总学时16 课程总学分0.5 ,其中实验总学时16 实验总学分0.5开设实验项目数: 3 ,其中必做实验项目数 3 选做实验项目数0适用专业:网络工程专业综合性、设计性实验项目数: 1 ,总学时: 6主笔人:刘淼主审人:日期:2012 年12 月10 日一、实验教学目标及基本要求《网络编程》教学内容非常丰富,主要包括联网原理、因特网寻址、UDP和TCP套接字编程及常见应用协议编程,在课堂讲授中,还要专门讲授数据流、异常处理和多线程编程等高级编程技术,并将这些高级编程技术贯穿于课堂示例和实验教学环节中。
《网络编程实验》为独立设置的实验课程,通过本实验课程的学习,帮助学生进一步掌握《网络编程》课程中学习的理论和技术,提高学生的网络应用编程能力。
二、实验项目的设置三、实验教学方式1、每个实验开始前,指导教师讲解实验目的、实验要求和实验报告的格式规范。
在实验过程中,向学生提出实验中的关键问题,了解学生的综合能力水平,尽量给出客观公正的评价。
2、每个实验项目都是以小组为单位完成,每个小组2人,鼓励学生之间和师生之间的探讨和研究。
四、考核方式与评分标准实验考核包含以下方面:1.学生对计算机网络基础理论的理解掌握程度;2.学生运用Java网络编程技术的软件开发能力;3.学生运用软件工程的理论和方法的能力;4.实验报告的规范程度;5.设计开发的软件的测试运行结果。
计算机网络课程实验指导
计算机网络课程实验指导计算机网络是现代计算机科学中的重要课程之一,通过实验可以更好地理解和掌握网络原理、协议以及网络应用开发等相关知识。
本文将为你提供一份计算机网络课程实验指导,帮助你顺利完成实验。
实验一:网络的基本连接与配置实验目标:通过配置计算机网络的基本连接,掌握网络设备的配置和使用。
实验步骤:1. 确定实验所需设备:至少需要两台计算机、一个交换机以及相应的网线。
2. 将计算机和交换机连接:使用网线将计算机和交换机连接起来,确保连接稳定。
3. 设置IP地址:为计算机和交换机设置合适的IP地址,确保在同一网段内。
4. 测试连接:使用ping命令测试计算机之间的连通性,确保网络连接正常。
5. 配置其他网络设备:根据实验需求,配置其他网络设备,如路由器、防火墙等。
实验二:网络协议分析与抓包技术实验目标:通过分析网络协议和使用抓包工具,掌握网络协议的基本原理和抓包技术的使用。
实验步骤:1. 安装抓包工具:选择合适的抓包工具,如Wireshark,并进行安装。
2. 抓包设置:打开抓包工具,选择合适的网络接口进行抓包设置。
3. 运行抓包工具:开始抓包,可选择特定的协议进行过滤。
4. 分析抓包结果:分析抓包结果,了解网络协议的交互过程。
5. 实验记录:记录抓包结果和分析过程,撰写实验报告。
实验三:网络应用开发实验目标:通过实际编写网络应用,熟悉网络应用开发的基本流程和技术。
实验步骤:1. 选择开发平台和语言:根据实验需求,选择合适的开发平台和编程语言。
2. 设计网络应用:明确网络应用的功能和需求,进行详细设计。
3. 编写代码:根据设计,编写网络应用的代码。
4. 测试和调试:运行和测试网络应用,修复可能存在的问题。
5. 实验报告:撰写实验报告,包括设计思路、代码实现和测试结果。
实验四:网络安全实验实验目标:通过网络安全实验,了解网络攻击和防护技术,提升网络安全意识和应对能力。
实验步骤:1. 配置防火墙:使用防火墙软件,如iptables,配置网络防火墙策略。
《网络编程技术》实验指导书实验二word版本
《网络编程技术》实验指导书实验二word版本实验二:面向对象编程实验目的:通过编程和上机实验理解Java语言是如何体现面向对象编程基本思想,熟悉类的封装方法以及如何创建类和对象,熟悉成员变量和成员方法的特性,熟悉类的继承性和多态性的作用,熟悉包、接口的使用方法,掌握OOP方式进行程序设计的方法。
实验要求:1、编写程序实现类的定义和使用。
2、编写不同成员和不同成员方法修饰方法的程序。
3、编写体现类的继承性(成员变量、成员方法、成员变量隐藏)的程序和多态性(成员方法重载、构造方法重载)的程序。
4、编写接口的定义和使用的程序。
5、编写包的定义和使用的程序。
实验内容:1、类的定义和使用●义一个满足如下要求的Date类:a.用下面的格式输出日期:日/月/年b.可运行在日期上加一天操作c.设置日期用该类编写一个显示当前日期的程序。
●创建一个桌子Table类,该类中有桌子名称、重量、桌面宽度、长度及桌子高度属性。
其中有:a.构造函数初始化所有数据成员b.Area():计算桌面的面积c.Display():在屏幕上输出所有数据成员的值d.ChangeWeight(int):改变桌子重量的函数e.在main()中实现创建一个桌子对象,计算桌面的面积,改变桌子重量,并在屏幕上输出所有桌子数据成员的值。
2、修饰符的使用:有时需要公开一些变量和方法,有时需要禁止其他对象使用变量和方法,这时可以使用修饰符来实现这个目的。
常用的修饰符如下。
Public,private,protected, package,static,final,transient,volatile。
●程序功能:通过两个类StaticDemo、TestDemo说明静态变量/方法与实例变量/方法的区别,程序源代码如下。
class StaticDemo{static int x;int y;public static int getX(){return x;}public static void setX(int newX){x= newX;}public int getY(){return y;}public void setY(int newY){y= newY;}}public class TestDemo{public static void main(String[] args){System.out.println("静态变量x="+StaticDemo.getX());System.out.println("实例变量y="+StaticDemo.getY());//非法,编译时将出错StaticDemo a=new StaticDemo();StaticDemo b=new StaticDemo();a.setX l);a.setY 2);b.setX(3);b.setY(4);System.out.println("静态变量a.X="+a.getX());System.out.println("实例变量a.y="+a.getY());System.out.println("静态变量b.x="+b.getX());System.out.println("实例变量b.y="+b.getY());}}●对上面的源程序进行编译,查错并运行。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
网络编程实验指导书执笔:王新祥教研室:计算机网络网络编程上机操作实验是本课程必不可少的实践环节。
上机实验的目的是使学生熟悉网络编程的全过程,加深对网络编程方法的理解,得到程序设计基本方法和技巧的训练,从而能真正掌握网络通信程序的设计方法,以解决网络通信的实际问题。
实验一 获取计算机的网卡地址(2学时)一、实验目的1、掌握使用NetBIOS得到MAC地址的方法。
2、掌握通过发送ARP来获取网络中计算机MAC地址的方法。
二、实验内容与步骤(一) 实验内容1、使用NetBIOS得到本机的MAC地址;2、使用ARP获取网络中计算机的MAC地址。
(二) 实验步骤1、利用NetBIOS得到MAC地址首先发送NCBENUM命令,获取网卡的数目和每张网卡的内部编号,然后对每个网卡标号发送NCBASTAT命令获取其MAC地址。
注意:这里的网卡是指捆绑了NetBEUI协议的通信协议栈,可以在网卡的属性处查看到。
(1) 在VC++ 6.0中创建空的控制台应用程序工程;(2) 新建一个源文件,并注意将此源文件添加到创建的工程中,然后输入如下代码:(3) 编译、链接并执行文件,分析程序输出的结果。
2、通过发送ARP来获取网卡的MAC地址在Windows 2000及以上系统中也可以通过发送ARP来获取网络中计算机的MAC地址,当然也包括自己的计算机。
函数SendARP的原型如下:DWORD WINAPI SendARP (IPAddr DestIP,IPAddr SrcIP,PULONG pMacAddr,PULONG PhyAddrLen );其中pMacAddr参数返回一个ULONG变量数组的指针。
该数组的前6个字节包括了DespIP对应的物理地址。
(1) 在VC++ 6.0中创建空的控制台应用程序工具;(2) 新建一个源文件并将其添加到工程中,然后输入如下代码:(3) 注意:要将“218.196.13.163”这个IP地址替换成自己所使用机器的IP地址。
(4) 将“实验一的支撑文件”目录下的所有文件拷贝到工程所在的目录;(5) 编译、链接并执行程序,注意分析程序的输出结果。
(三) 注意事项实验内容1的程序目录下要添加四个文件,即“IPExport.h”、“IPHlpApi.h”、“IPHlpApi.Lib”及“IPTypes.h”。
并在工程设置对话框的“Link”选项卡中的“Object/libray Modules:”编辑框内的最后面添加“ws2_32.lib IPHlpApi.Lib”内容,以便对这两个库文件的引用。
或者在源文件的头部添加如下两行代码:#pragma comment (lib, "ws2_32.lib")#pragma comment (lib, "IPHlpApi.Lib")三、实验要求程序能正常运行,能得到准确的结果。
实验二 简易聊天室(4学时)一、实验目的1、熟悉VC++编程环境;2、熟悉使用VC++设计程序的过程;3、熟练掌握NetBIOS编程的基本思路和方法。
二、实验原理NetBIOS网络编程的核心是通过这个标准接口,以基于统一的命令集的网络控制块NCB作为参数的“Netbios(PNCB pncb)”函数调用,使用VC++ 6.0实现具有聊天功能的局域网内控制台应用程序。
使用Netbios函数的关键是对NCB结构的理解,该结构体的定义如下:typedef struct _NCB {UCHAR ncb_command;UCHAR ncb_retcode;UCHAR ncb_lsn;UCHAR ncb_num;PUCHAR ncb_buffer;WORD ncb_length;UCHAR ncb_callname[NCBNAMSZ];UCHAR ncb_name[NCBNAMSZ];UCHAR ncb_rto;UCHAR ncb_sto;void (*ncb_post) (struct _NCB *);UCHAR ncb_lana_num;UCHAR ncb_cmd_cplt;UCHAR ncb_reserve[10];HANDLE ncb_event;} NCB;三、实验内容与步骤(一) 实验内容使用Netbios函数实现聊天室功能。
(二) 实验步骤1、在Visual C++中创建头文件“NetBIOS.h”,并输入如下代码:#include <windows.h>#include <stdio.h>#pragma comment(lib,"netapi32.lib")#define MAXSESSIONS 254#define MAXNAMES 254#define NBCheck(x) if (NRC_GOODRET != x.ncb_retcode) { \ printf("Line %d: Got 0x%x from NetBios()\n", \__LINE__, x.ncb_retcode); \}#define PNBCheck(x) if (NRC_GOODRET != x->ncb_retcode) { \ printf("Line %d: Got 0x%x from NetBios()\n", \__LINE__, x->ncb_retcode); \}#define Online 1 // A user is on line#define Offline 2 // A user is off line#define Listen 3 // A user is waiting for connection#define Message 4 // A user is on linetypedef struct DataGram{ // the format of a datagramUCHAR flag; // the type of messagechar message[256]; //the content of message} DataGram, *PDataGram;char LocalName[NCBNAMSZ]; //local namechar GroupName[NCBNAMSZ]; //group nameUCHAR NameNum;UCHAR GroupNameNum;#define DGLEN sizeof(struct DataGram)void MakeNetbiosName(char *achDest, char *szSrc){int cchSrc;cchSrc =strlen(szSrc);if (cchSrc > NCBNAMSZ) cchSrc = NCBNAMSZ;memset(achDest, ' ', NCBNAMSZ);memcpy(achDest, szSrc, cchSrc);if (cchSrc!=NCBNAMSZ) achDest[cchSrc]='\0';}UCHAR LanaEnum(LANA_ENUM *lenum){NCB ncb;UCHAR uRetCode;memset( &ncb, 0, sizeof(NCB) );ncb.ncb_command = NCBENUM;ncb.ncb_buffer = (UCHAR *)lenum;ncb.ncb_length = sizeof(LANA_ENUM);uRetCode = Netbios( &ncb );NBCheck(ncb)return uRetCode;}UCHAR RestNCB(UCHAR jiangxue_lana){NCB jiangxue_ncb;memset(&jiangxue_ncb,0,sizeof(NCB));jiangxue_ncb.ncb_command=NCBRESET;jiangxue_ncb.ncb_callname[0]=MAXSESSIONS;jiangxue_ncb.ncb_callname[2]=MAXNAMES;jiangxue_ncb.ncb_lana_num=jiangxue_lana;Netbios(&jiangxue_ncb);NBCheck(jiangxue_ncb)return (jiangxue_ncb.ncb_cmd_cplt);}UCHAR Astatus(UCHAR jiangxue_lana, PVOID pBuffer, int cbBuffer,char *szName) {NCB jiangxue_ncb;ZeroMemory(&jiangxue_ncb,sizeof(NCB));jiangxue_ncb.ncb_command=NCBASTAT;jiangxue_ncb.ncb_lana_num=jiangxue_lana;jiangxue_ncb.ncb_buffer=(PUCHAR)pBuffer;jiangxue_ncb.ncb_length=cbBuffer;strcpy((char *)jiangxue_ncb.ncb_callname,szName);Netbios(&jiangxue_ncb);NBCheck(jiangxue_ncb)return(NRC_GOODRET==jiangxue_ncb.ncb_retcode);}BOOL Adapterlist(UCHAR nlana, char *szName){ //get the state of each adapter with some protocol.int cbBuffer;ADAPTER_STATUS *pStatus;NAME_BUFFER *pNames;int i;HANDLE hHeap;char cname[16];hHeap=GetProcessHeap();//allocate the largest buffer that might be needed.cbBuffer=sizeof(ADAPTER_STATUS)+255*sizeof(NAME_BUFFER);pStatus=(ADAPTER_STATUS *)HeapAlloc(hHeap,0, cbBuffer);if (NULL==pStatus) return FALSE;if(!Astatus(nlana,(PVOID)pStatus,cbBuffer,szName)){HeapFree(hHeap, 0, pStatus);return FALSE;}//list the adapter status structure and namesif(pStatus->adapter_type==0xFE)strcpy(cname,"Ethernet");else strcpy(cname,"The other type");printf("The %s Number on LANA %d with version %d.%d is: %02x%02x%02x%02x%02x%02x\n",cname, nlana,pStatus->rev_major,pStatus->rev_minor,pStatus->adapter_address[0],pStatus->adapter_address[1],pStatus->adapter_address[2],pStatus->adapter_address[3],pStatus->adapter_address[4],pStatus->adapter_address[5] );printf("The number of names in the local names table is %d\n",pStatus->name_count);pNames=(NAME_BUFFER *)(pStatus+1);for (i=0;i<pStatus->name_count;i++)printf("\t%.*s\n",NCBNAMSZ,pNames[i].name);HeapFree(hHeap,0,pStatus);return TRUE;}UCHAR AddName(char * kemin_LocalName, UCHAR kemin_lana, UCHAR *kemin_LocalNameNum) {NCB kemin_ncb;memset(&kemin_ncb,0,sizeof(NCB));kemin_ncb.ncb_command=NCBADDNAME;kemin_ncb.ncb_lana_num=kemin_lana;strcpy((char *)kemin_ncb.ncb_name,kemin_LocalName);Netbios(&kemin_ncb);NBCheck(kemin_ncb)*kemin_LocalNameNum=kemin_ncb.ncb_num;return(kemin_ncb.ncb_cmd_cplt);}UCHAR AddGroupName(char * limin_GroupName, UCHAR limin_lana, UCHAR *limin_GroupNameNum) {NCB limin_ncb;memset(&limin_ncb,0,sizeof(NCB));limin_ncb.ncb_command=NCBADDGRNAME;limin_ncb.ncb_lana_num=limin_lana;strcpy((char *)limin_ncb.ncb_name,limin_GroupName);Netbios(&limin_ncb);NBCheck(limin_ncb)*limin_GroupNameNum=limin_ncb.ncb_num;return(limin_ncb.ncb_cmd_cplt);}UCHAR DeleteName(char *liufei_LocalName, UCHAR liufei_lana){NCB liufei_ncb;memset(&liufei_ncb,0,sizeof(NCB));liufei_ncb.ncb_command=NCBDELNAME;liufei_ncb.ncb_lana_num=liufei_lana;strcpy((char *)liufei_ncb.ncb_name,liufei_LocalName);Netbios(&liufei_ncb);NBCheck(liufei_ncb)return(liufei_ncb.ncb_cmd_cplt);}UCHAR NetbiosListen(int lana, PNCB pncb, char *SourName){memset(pncb,0,sizeof(NCB));pncb->ncb_command=NCBLISTEN; //synchronous callstrcpy((char *)pncb->ncb_name,SourName);strcpy((char *)pncb->ncb_callname,"*");pncb->ncb_lana_num=lana;return Netbios(pncb);}UCHAR NetbiosCall(PNCB yixiong_pncb,UCHAR lana,char *yixiong_SourName, char *yixiong_DestName) {memset(yixiong_pncb,0,sizeof(NCB));yixiong_pncb->ncb_command=NCBCALL;yixiong_pncb->ncb_lana_num=lana;strcpy((char *)yixiong_pncb->ncb_name, yixiong_SourName);strcpy((char *)yixiong_pncb->ncb_callname, yixiong_DestName);return Netbios(yixiong_pncb);}UCHAR SessionSend(UCHAR lana, UCHAR zhangke_SessionNum, char *pBuffer, WORD Length){NCB zhangke_ncb;memset(&zhangke_ncb,0,sizeof(NCB));zhangke_ncb.ncb_command=NCBSEND;zhangke_ncb.ncb_lsn=zhangke_SessionNum;zhangke_ncb.ncb_buffer=(UCHAR *)pBuffer;zhangke_ncb.ncb_length=Length;return Netbios(&zhangke_ncb);}UCHAR SessionRecv(UCHAR lana, UCHAR guojun_SessionNum, char *pBuffer){NCB guojun_ncb;memset(&guojun_ncb,0,sizeof(NCB));guojun_ncb.ncb_command=NCBRECV;guojun_ncb.ncb_lsn=guojun_SessionNum;guojun_ncb.ncb_buffer=(UCHAR *)pBuffer;guojun_ncb.ncb_length=512;return Netbios(&guojun_ncb);}UCHAR HangupSession(UCHAR wanglinjia_SessionNum){NCB wanglinjia_ncb;UCHAR ucRc;memset(&wanglinjia_ncb,0,sizeof(NCB));wanglinjia_ncb.ncb_command=NCBHANGUP;wanglinjia_ncb.ncb_lsn=wanglinjia_SessionNum;ucRc=Netbios(&wanglinjia_ncb);return(ucRc);}UCHAR SDGSend(UCHAR lana,char *wugang_DestName, UCHAR wugang_LocalNameNum,char *pBuffer, WORD Length){NCB wugang_ncb;UCHAR ucRc;memset(&wugang_ncb,0,sizeof(NCB));wugang_ncb.ncb_command=NCBDGSEND;strcpy((char *)wugang_ncb.ncb_callname, wugang_DestName);wugang_ncb.ncb_num=wugang_LocalNameNum;wugang_ncb.ncb_buffer=(UCHAR *)pBuffer;wugang_ncb.ncb_length=Length;ucRc=Netbios(&wugang_ncb);NBCheck(wugang_ncb)return(ucRc);}UCHAR ADGSend(UCHAR lana,char *DestName, UCHAR LocalNameNum, HANDLE hEvent,char *pBuffer, WORD Length){NCB ncb;memset(&ncb,0,sizeof(NCB));ncb.ncb_command=NCBDGSEND|ASYNCH;ncb.ncb_lana_num=lana;strcpy((char *)ncb.ncb_callname, DestName);ncb.ncb_num=LocalNameNum;ncb.ncb_buffer=(UCHAR *)pBuffer;ncb.ncb_length=Length;ncb.ncb_cmd_cplt=0xff;ncb.ncb_event=hEvent;Netbios(&ncb);return ncb.ncb_cmd_cplt;}UCHAR SDGRecv(UCHAR lana,UCHAR wangyan_Num,char *DestName, char *pBuffer, WORD *len) {NCB wangyan_ncb;memset(&wangyan_ncb,0,sizeof(NCB));wangyan_ncb.ncb_command=NCBDGRECV;wangyan_ncb.ncb_lana_num=lana;wangyan_ncb.ncb_num=wangyan_Num;wangyan_ncb.ncb_buffer=(UCHAR *)pBuffer;wangyan_ncb.ncb_length=*len;Netbios(&wangyan_ncb);NBCheck(wangyan_ncb)strcpy(DestName,(char *)wangyan_ncb.ncb_callname);return wangyan_ncb.ncb_cmd_cplt;}UCHAR DatagramSendBC(UCHAR lana, UCHAR num,char * buf, WORD len){ //send the broadcasting datagram from the given name-based numberNCB ncb;ZeroMemory(&ncb,sizeof(NCB));ncb.ncb_command=NCBDGSENDBC;ncb.ncb_lana_num=lana;ncb.ncb_num=num;ncb.ncb_buffer=(PUCHAR)buf;ncb.ncb_length=len;Netbios(&ncb);NBCheck(ncb)return ncb.ncb_retcode;}UCHAR DatagramRecvBC(UCHAR lana, UCHAR num,char *buf, WORD *len, char *Callname){ //receive the broadcasting datagram from the given name-based numberNCB ncb;ZeroMemory(&ncb,sizeof(NCB));ncb.ncb_command=NCBDGRECVBC;ncb.ncb_lana_num=lana;ncb.ncb_num=num;ncb.ncb_buffer=(PUCHAR)buf;ncb.ncb_length=*len;Netbios(&ncb);NBCheck(ncb)*len=ncb.ncb_length;strcpy(Callname,(char *)ncb.ncb_callname);return ncb.ncb_retcode;}int CommandTranslating(const char *Command) //return the different value for the different command {if(strcmp(Command,"lookup")==0) return 1; //look up the status of the locall adapterif(strcmp(Command,"session")==0) return 2; //session communicationif(strcmp(Command,"sendtoname")==0) return 3; //unicast or multicast communicationif(strcmp(Command,"sendtoall")==0) return 4; //broadcast communicationif(strcmp(Command,"exit")==0) return 5; // quitreturn 0;}2、在VC++中创建源文件“NetChat.cpp”,并输入如下代码:#include "NetBIOS.h"UCHAR Elana[10];UCHAR Elength = 0;LANA_ENUM lenum;DWORD WINAPI SessionReceiveThread(LPVOID param) //the thread to receive the data for the session {PNCB pncb = (PNCB)param;buffer[512];charSessionNum;UCHARretcode;UCHARDestName[NCBNAMSZ];charSessionNum = pncb->ncb_lsn;memset(DestName, '\0', NCBNAMSZ);(char *)pncb->ncb_callname);strcpy(DestName,for(;;){memset(buffer, '\0', 512);retcode = SessionRecv(Elana[0], SessionNum, buffer);if(retcode == 0){toyou(on session):", DestName);saysprintf("\n%sputs(buffer);message to send to %s:", DestName);inputprintf("pleasecontinue;}else{connection to you!\n", DestName);theprintf("\n%sleavesHangupSession(SessionNum);break;}}return1;}void ServerSession(PNCB pncb){hSThread;HANDLEdwSExitCode;DWORDDWORDid;sbuffer[512];charretcode;UCHARSessionNum;UCHARDestName[NCBNAMSZ];charSessionNum = pncb->ncb_lsn;memset(DestName, '\0', NCBNAMSZ);strcpy(DestName,(char *)pncb->ncb_callname);hSThread = CreateThread(NULL, 0, SessionReceiveThread, (PVOID)pncb, 0, &id);//create a thread to receive the messagedwSExitCode = 0;retcode = 0;printf("%s has accepted the connection to %s!\n", LocalName, DestName);Sleep(1000);memset(sbuffer, '\0', 512);strcpy(sbuffer, "Welcome to Server!");SessionSend(Elana[0], SessionNum, sbuffer, sizeof(sbuffer));printf("When you send a message to the other party, \n");means stopping to send!\n\n");\"exit\"messageprintf("thefor(;;){printf("please input message to send to %s:", DestName);memset(sbuffer, '\0', 512);gets(sbuffer);if(strcmp(sbuffer, "exit") == 0){dwSExitCode);TerminateThread(hSThread,CloseHandle(hSThread);HangupSession(SessionNum);break;}retcode = SessionSend(Elana[0], SessionNum, sbuffer, sizeof(sbuffer));if(retcode != 0) break;}}void ClientSession(PNCB pncb){hCThread;HANDLEdwCExitCode;DWORDid;DWORDcbuffer[512];charretcode;UCHARUCHARSessionNum;char DestName[NCBNAMSZ];SessionNum = pncb->ncb_lsn;memset(DestName, '\0', NCBNAMSZ);(char *)pncb->ncb_callname);strcpy(DestName,hCThread = CreateThread(NULL, 0, SessionReceiveThread, (PVOID)pncb, 0, &id); //create a thread to receive the messagedwCExitCode = 0;retcode = 0;printf("%s has connected to the server %s!\n", LocalName, DestName);printf("When you send a message to the other party, \n");printf("the message \"exit\" means stopping to send!\n");Sleep(1000);for(;;){memset(cbuffer, '\0', 512);gets(cbuffer);if(strcmp(cbuffer, "exit") == 0){dwCExitCode);TerminateThread(hCThread,CloseHandle(hCThread);HangupSession(SessionNum);break;}retcode = SessionSend(Elana[0], SessionNum, cbuffer, sizeof(cbuffer));if(retcode != 0) break;printf("please input message to send to %s:", DestName);}}DWORD WINAPI GDGRecvTread(LPVOID param)//receive the message from the group{WORD len = DGLEN;Gbuffer[DGLEN];char=(PDataGram)Gbuffer;pdataPDataGramGCallName[NCBNAMSZ];charwhile(1){memset(GCallName, '\0', NCBNAMSZ);if(SDGRecv(Elana[0], GroupNameNum, GCallName, Gbuffer, &len) == NRC_GOODRET) {0)==LocalName)if(strcmp(GCallName,sendout!\n");hasmulticastingmessageprintf("Theelse{printf("\nMulticasting sender's name: %s\n", GCallName);printf("the content of message: %s\n", pdata->message);printf("$");}}}1;return}DWORD WINAPI SDGRecvTread(LPVOID param) //receive the message from Single user{ //receive the information from the given name number,//if the name number is set to 0xff, then receive all the local dataWORD len1 = DGLEN;charbuffer1[DGLEN];(PDataGram)buffer1;=PDataGrampdata1CallName1[NCBNAMSZ];charwhile(1){memset(CallName1, '\0', NCBNAMSZ);if(SDGRecv(Elana[0], NameNum, CallName1, buffer1, &len1) == NRC_GOODRET){Message)if(pdata1->flag=={printf("\nUnicasting sender's name: %s\n", CallName1);printf("the content of message: %s\n", pdata1->message);printf("$");}if(pdata1->flag == Online){printf("\nThe user %s is on line and has the group name %s!\n$",CallName1, pdata1->message);}}}return 1;}void DGsendCMD(UCHAR lana, UCHAR NameNum, char * DestName){char buff[256];char buffer[DGLEN];WORD len = DGLEN;PDataGram pdata = (PDataGram)buffer;printf("please input message to send to the name %s:", DestName);memset(buff, '\0', 256);gets(buff);pdata->flag = Message;strcpy(pdata->message, buff);SDGSend(lana, DestName, NameNum, (char *)pdata, len);}DWORD WINAPI DGRecvBCTread(LPVOID param) //receive the broadcasting message from single user{ //receive the information from the given name number,WORD len;char buffer[DGLEN];char buff[DGLEN];PDataGram pdata1 = (PDataGram)buffer;PDataGram pdata2 = (PDataGram)buff;char DestName[NCBNAMSZ];while(1){len = DGLEN;memset(DestName, '\0', NCBNAMSZ);if(DatagramRecvBC(Elana[0], NameNum, buffer, &len, DestName) != NRC_GOODRET)continue;switch(pdata1->flag){case Message: // Ordinary messageif(strcmp(DestName, LocalName) == 0){printf("Broadcasting message has sent out!\n");break;}printf("\nThe user %s broadcasts the message:%s\n$", DestName, pdata1->message);break;case Online: // a user comes on lineif(strcmp(DestName, LocalName) == 0) break;printf("\nThe user %s goes on line and has the group name %s!\n$",pdata1->message);DestName,Sleep(1000);=DGLEN;lenOnline;=pdata2->flag256);memset(pdata2->message,'\0',GroupName);strcpy(pdata2->message,NameNum, (char *)pdata2, len);SDGSend(Elana[0],DestName,break;case Offline: //a user gets off lineif(strcmp(DestName, LocalName) == 0) break;printf("\nThe user %s has been off line!\n$", DestName);break;case Listen: //a user is waiting for a connectionif(strcmp(DestName, LocalName) == 0){printf("Listening message has sent out!\n");break;}printf("\nThe server %s is waiting for a client to connect!\n$", DestName);break;}}1;return}void DGsendBCCMD(UCHAR lana, UCHAR NameNum){buff[256];charbuffer[DGLEN];charWORD len = DGLEN;=(PDataGram)buffer;pdataPDataGramprintf("please input message to broadcast:");memset(buff, '\0', 256);gets(buff);Message;=pdata->flagmemset(pdata->message, '\0', 256);buff);strcpy(pdata->message,NameNum, (char *)pdata, len);DatagramSendBC(lana,}int main(void){DWORD dwExitCode1, dwExitCode2, dwExitCode3;DWORDid;HANDLE hThread1, hThread2, hThread3;command[64];charUCHAR uRetCode = 0;i;intsKey[64];chardwExitCode1 = 0;dwExitCode2 = 0;dwExitCode3 = 0;//learn The information of the adapter resource!uRetCode = LanaEnum(&lenum);if (uRetCode != NRC_GOODRET) return -1;normal!\n");printf("Adapterisfor (i = 0; i<lenum.length;i++){ //reset the each adapter with protocol.uRetCode = RestNCB(na[i]);if (uRetCode == NRC_GOODRET){na[i];=Elana[Elength]Elength++;}};if (Elength == 0){printf("NCB reseting fails\n");getchar();-1;return}printf("The length of lenum is %d \n", Elength);printf("NCB reseting is OK\n");printf("Enter the local name:");sKey);scanf("%s",sKey);MakeNetbiosName(LocalName,fflush(stdin);printf("Enter the group name:");scanf("%s",sKey);sKey);MakeNetbiosName(GroupName,fflush(stdin);if (AddName(LocalName, Elana[0], &NameNum) != NRC_GOODRET){printf("Name adding is going wrong!\n");getchar();return-1;}printf("Name adding is OK!\n");if (AddGroupName(GroupName, Elana[0], &GroupNameNum) != NRC_GOODRET) {adding is going wrong!\n");Nameprintf("Groupgetchar();-1;return}printf("Group Name adding is OK!\n");hThread1 = CreateThread(NULL, 0, DGRecvBCTread, NULL, 0, &id);// create a thread to receive the broadcast messageshThread2 = CreateThread(NULL, 0, GDGRecvTread, NULL, 0, &id);// create a thread to receive the multicast messageshThread3 = CreateThread(NULL, 0, SDGRecvTread, NULL, 0, &id);// create a thread to receive the unicast messagesSleep(3000);system("cls");printf("The locall name: %s and the group name: %s\n", LocalName, GroupName); printf("*******************************************************\n");prompt:$\n"printf( "\t\tcommand" lookup: learn the information about the adapter\n"" session: setup the session communication \n""sendtoname: send a datagram to the given name\n"" sendtoall: send a datagram to all the users on LAN\n"" exit: quit\n");printf("*******************************************************\n");WORD len = DGLEN;data;DataGram(PDataGram)&data;=PDataGrampdataCallName[NCBNAMSZ];charNCBncb;memset(&ncb, 0, sizeof(NCB));PNCB pncb = &ncb;Online;=pdata->flagGroupName);strcpy(pdata->message,DatagramSendBC(Elana[0],NameNum, (char *)pdata, len);while(1){printf("$");command);scanf("%s",fflush(stdin);switch(CommandTranslating(command)){case 1: //learn the information about the adapterprintf("If you type \"l\", it means localname otherwise the adapter\n");choice:");yourenterprintf("PleasesKey);scanf("%s",fflush(stdin);if (strcmp(sKey, "l") == 0)LocalName);Adapterlist(Elana[0],elseAdapterlist(Elana[i],"*");0;i<Elength;i++)for(i=Sleep(999);break;case 2: //setup the session communication* (to listen as a server) \n");charactertheprintf("Enterprintf("or the server's name( to connect as a client ):");scanf("%s", sKey);MakeNetbiosName(CallName, sKey);fflush(stdin);if(strcmp(CallName, "*") == 0){pdata->flag = Listen;memset(pdata->message, '\0', 256);strcpy(pdata->message, "**");DatagramSendBC(Elana[0], NameNum, (char *)pdata, len);while(1){NetbiosListen(Elana[0], pncb, LocalName);ServerSession(pncb);printf("If you need listen to the next, please type the letter \"y\":");scanf("%s", sKey);if(strcmp(sKey, "y") != 0) break;}}else{uRetCode = NetbiosCall(pncb, Elana[0], LocalName, CallName);if (uRetCode == 0) ClientSession(pncb);else printf("The server %s isn't listenning!\n", CallName);}Sleep(3000);break;case 3: //send a datagram to the given nameprintf("Enter the receiver's or group's name:");scanf("%s", sKey);MakeNetbiosName(CallName, sKey);fflush(stdin);DGsendCMD(Elana[0], NameNum, CallName);Sleep(999);break;case 4: //send a datagram to all the users on LANDGsendBCCMD(Elana[0], NameNum);Sleep(999);break;case 5: //quitTerminateThread(hThread1, dwExitCode1);TerminateThread(hThread2, dwExitCode2);TerminateThread(hThread3, dwExitCode3);pdata->flag = Offline;strcpy(pdata->message, GroupName);DatagramSendBC(Elana[0], NameNum, (char *)pdata, len);CloseHandle(hThread1);CloseHandle(hThread2);CloseHandle(hThread3);DeleteName(GroupName, Elana[0]);Elana[0]);DeleteName(LocalName,1;returndefault:printf("You type a wrong command!\n");Sleep(999);break;}}getchar();0;return}3、在系统托盘中双击本地连接,在弹出的“本地连接状态”对话框中单击“属性”按钮,在弹出的“本地连接属性”对话框中选择“常规”选项卡,在“此连接使用下列项目”列表框中选择“Internet 协议 (TCP/IP)”,然后点击“属性”按钮,在弹出的“Internet 协议 (TCP/IP) 属性”对话框中单击“高级”按钮,在弹出的“高级 TCP/IP 设置”对话框中选定“WINS”选项卡,选择“启用 TCP/IP 上的 NetBIOS”,然后单击“确定”按钮两次,最后单击“关闭”按钮,完成启用NetBIOS的设置。