计算机网络实验.docx
《计算机网络实验.docx》由会员分享,可在线阅读,更多相关《计算机网络实验.docx(12页珍藏版)》请在冰豆网上搜索。
计算机网络实验
学生学号
0120810680412
实验课成绩
武汉理工大学
学生实验报告书
实验课程名称《计算机网络》
开课学院计算机科学与技术学院
指导老师姓名刘东飞
学生姓名陈天明
学生专业班级软件0804班
2011—2011学年第二学期
实验课程名称:
计算机网络
实验项目名称
获取网卡的MAC地址
实验成绩
实验者
陈天明
专业班级
软件0804班
组别
同组者
实验日期
年月日
第一部分:
实验分析与设计(可加页)
1、实验内容描述(问题域描述)
实验一获取以太网卡的MAC地址
内容:
设计一个程序,使得能够获取本机安装的以太网卡的物理地址
基本要求:
一人独立完成。
可显示运行机器的MAC地址。
2、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述)
MAC:
在局域网中,硬件地址又称为物理地址或MAC地址。
ARP协议简介
ARP(AddressResolveProtocol)地址请求解析协议,用于寻找和IP地址相对应的MAC
地址。
在RFC826中定义了ARP协议的数据格式和类型。
ARP协议属于在网络层的下部,
可看作为网络层和数据链路层的接口,主要用于IPv4以太网。
ARP消息类型有2种:
ARPrequest:
ARP请求
ARPresponse:
ARP应答
ARP协议格式
ARP报文中各字段的意义
硬件类型:
以太网接口类型为1
协议类型:
IP协议类型为080016
操作:
ARP请求为1,ARP应答为2
硬件地址长度:
MAC地址长度为6B
协议地址长度:
IP地址长度为4B
源MAC地址:
发送方的MAC地址
源IP地址:
发送方的IP地址
目的MAC地址:
ARP请求中该字段没有意义;ARP响应中为接收方的
MAC地址
目的IP地址:
ARP请求中为请求解析的IP地址;ARP响应中为接收方
的IP地址
ARP协议的改进
高速缓存技术
高速缓存区中保存最近获得的ARP表项
高速缓冲区中ARP表项新鲜性的保持:
计时器
实验表明高速缓冲区的使用可以大大提高ARP的效率
其他改进技术
目的主机接收到ARP请求后将源主机的IP地址与物理地址映射关
系存入自己的高速缓冲区
ARP请求是广播发送的,网络中的所有主机接收到ARP请求后都
可以将源主机的IP地址与物理地址映射关系存入自己的高速缓冲
区
主机启动时主动广播自己的IP地址与物理地址的映射关系
3、主要仪器设备及耗材
Windows操作系统,VC
第二部分:
实验调试与结果分析(可加页)
1、调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现的问题等)
本实验是在vc环境下完成的,使用了GetAdaptersInfo,遍历所有的适配器,将MAC地址显示出来。
2、实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等)
运行程序,得到本机的mac地址,如下图:
3、实验小结、建议及体会
通过本次实验,对计算机网络的相关知识有了更加深入的理解,对数据链路层的相关协议及操作方式有了更多的了解,锻炼了自己编写程序的能力,尤其是网络编程的技巧和方法。
附代码:
//mac.cpp:
定义控制台应用程序的入口点。
//
#include"stdafx.h"
#include
#include
#include
#include
usingnamespacestd;
#pragmacomment(lib,"Iphlpapi.lib")
stringGetMac()
{
stringstrMac;
ULONGulAdapterInfoSize=sizeof(IP_ADAPTER_INFO);
IP_ADAPTER_INFO*pAdapterInfoBkp=NULL,*pAdapterInfo=(IP_ADAPTER_INFO*)newchar[ulAdapterInfoSize];
if(GetAdaptersInfo(pAdapterInfo,&ulAdapterInfoSize)==ERROR_BUFFER_OVERFLOW)//缓冲区不够大
{
deletepAdapterInfo;
pAdapterInfo=(IP_ADAPTER_INFO*)newchar[ulAdapterInfoSize];
pAdapterInfoBkp=pAdapterInfo;
}
if(GetAdaptersInfo(pAdapterInfo,&ulAdapterInfoSize)==ERROR_SUCCESS)
{
do{//遍历所有适配器
if(pAdapterInfo->Type==MIB_IF_TYPE_ETHERNET)//判断是否为以太网接口
{
//pAdapterInfo->Description是适配器描述
//pAdapterInfo->AdapterName是适配器名称
for(UINTi=0;iAddressLength;i++)
{
charszTmp[8];
sprintf(szTmp,"%02X%c",pAdapterInfo->Address[i],(i==pAdapterInfo->AddressLength-1)?
'\0':
'-');
strMac.append(szTmp);
if((i+7)%6==0)
{
szTmp[0]='\n';
szTmp[1]='\0';
strMac.append(szTmp);
}
}
}
pAdapterInfo=pAdapterInfo->Next;
}while(pAdapterInfo);
}
if(pAdapterInfoBkp)
deletepAdapterInfoBkp;
returnstrMac;
}
int_tmain(intargc,_TCHAR*argv[])
{
stringstrMac=GetMac();
printf("%s\r\n",strMac.c_str());
system("pause");
return0;
}
实验课程名称:
计算机网络
实验项目名称
基于Socket的网络通信设计
实验成绩
实验者
陈天明
专业班级
软件0804
组别
同组者
实验日期
年月日
第一部分:
实验分析与设计(可加页)
1、实验内容描述(问题域描述)
实验二基于Socket的网络通信设计
内容:
综合运用网络协议、编程语言、API和图形界面实现基于socket建立、监听、连接、发送数据和接收数据的网络通信程序。
基本要求:
两人一组为单位,一个负责发送程序设计,一个负责接收程序设计,程序设计完成后,可以进行字符数据收发或文件传输。
2、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述)
本实验完成的是计算机远程控制。
基于远程执行命令行来达到远程控制的结果。
实验原理:
实验使用java的socket来完成命令数据和执行结果数据的传输。
所谓socket通常也称作"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
Socket是建立网络连接时使用的。
在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。
对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。
不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。
1.本程序使用Winsocket简介
WindowsSockets规范以U.C.Berkeley大学BSDUNIX中流行的Socket接口为范例定义了一套MicosoftWindows下网络编程接口。
它不仅包含了人们所熟悉的BerkeleySocket风格的库函数;也包含了一组针对Windows的扩展库函数,以使程序员能充分地利用Windows消息驱动机制进行编程。
WindowsSockets规范本意在于提供给应用程序开发者一套简单的API,并让各家网络软件供应商共同遵守。
此外,在一个特定版本Windows的基础上,WindowsSockets也定义了一个二进制接口(ABI),以此来保证应用WindowsSocketsAPI的应用程序能够在任何网络软件供应商的符合WindowsSockets协议的实现上工作。
因此这份规范定义了应用程序开发者能够使用,并且网络软件供应商能够实现的一套库函数调用和相关语义。
遵守这套WindowsSockets规范的网络软件,我们称之为WindowsSockets兼容的,而WindowsSockets兼容实现的提供者,我们称之为WindowsSockets提供者。
一个网络软件供应商必须百分之百地实现WindowsSockets规范才能做到现WindowsSockets兼容。
任何能够与WindowsSockets兼容实现协同工作的应用程序就被认为是具有WindowsSockets接口。
我们称这种应用程序为WindowsSockets应用程序。
WindowsSockets规范定义并记录了如何使用API与Internet协议族(IPS,通常我们指的是TCP/IP)连接,尤其要指出的是所有的WindowsSockets实现都支持流套接口和数据报套接口.应用程序调用WindowsSockets的API实现相互之间的通讯。
WindowsSockets又利用下层的网络通讯协议功能和操作系统调用实现实际的通讯工作。
它们之间的关系如图
2.Server-Client模型的程序原理
开发原理:
服务器,使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。
客户端,使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。
客户端不需要指定打开的端口,通常临时的、动态的分配一个1024以上的端口。
Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。
要学Internet上的TCP/IP网络编程,必须理解Socket接口。
Socket接口设计者最先是将接口放在Unix操作系统里面的。
如果了解Unix系统的输入和输出的话,就很容易了解Socket了。
网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。
Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。
三、主要仪器设备及耗材
Windows操作系统,vc
实验效果:
附代码:
Server:
#include
#include
voidmain()
{
WORDwVersionRequested;
WSADATAwsaData;
interr;
wVersionRequested=MAKEWORD(1,1);
err=WSAStartup(wVersionRequested,&wsaData);
if(err!
=0){
return;
}
if(LOBYTE(wsaData.wVersion)!
=1||
HIBYTE(wsaData.wVersion)!
=1){
WSACleanup();
return;
}
SOCKETsockSrv=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_INaddrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
listen(sockSrv,5);
SOCKADDR_INaddrClient;
intlen=sizeof(SOCKADDR);
SOCKETsockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
while
(1)
{
charsendBuf[100];
scanf("%s",sendBuf);
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
charrecvBuf[100];
recv(sockConn,recvBuf,100,0);
printf("Client:
%s\n",recvBuf);
}
closesocket(sockConn);
closesocket(sockSrv);
}
Client:
#include
#include
voidmain()
{
WORDwVersionRequested;
WSADATAwsaData;
interr;
wVersionRequested=MAKEWORD(1,1);
err=WSAStartup(wVersionRequested,&wsaData);
if(err!
=0){
return;
}
if(LOBYTE(wsaData.wVersion)!
=1||
HIBYTE(wsaData.wVersion)!
=1){
WSACleanup();
return;
}
SOCKETsockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_INaddrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
while
(1)
{
charrecvBuf[100];
recv(sockClient,recvBuf,100,0);
printf("Server:
%s\n",recvBuf);
charsendBuf[100];
scanf("%s",sendBuf);
send(sockClient,sendBuf,strlen(sendBuf)+1,0);
}
closesocket(sockClient);
WSACleanup();
}