网络编程技术实验报告
实验名称实验一网络编程基础训练
实验报告要求: 1.实验目的 2.实验要求 3.实验环境 4.实验作业 5.问题及解决
6.思考问题
7.实验体会
【实验目的】
掌握Wireshark的基本用法,掌握netstat的基本用法,能够使用这些工具对网络应用程序的传输过程进行捕获、观察和状态分析;了解Windows Sockets API的基本函数功能,掌握Windows Sockets的编程环境配置,掌握网络程序设计的基本过程。
【实验要求】
1、下载安装Wireshark,熟悉捕获、查看、过滤、查找等基本方法,对用户飞秋文件
传输、文字聊天等行为进行网络通信过程分析。
2、熟悉netstat命令,查看用户使用网络应用程序过程中对系统网络状态的改变。
3、使用Windows Sockets的API函数获得本机的IP地址。
4、使用Windows Sockets的API函数获得给定域名的IP地址。
【实验环境】
1.飞秋数据包的捕获用Wireshark;
2.Windows8自带命令提示符;
3.VS 2012编写程序。
【实验作业】
NO.1:飞秋文件传输、文字聊天等行为分析
1.数据包捕获:
2.飞秋文件传输、文字聊天的网络通信过程分析:
1)通过广播方式,查询局域网内所有主机的MAC地址,采用ARP协议,解析目标IP地址
为10.104.113.130的主机:
2) IP地址为10.104.113.130的主机回应请求,告知本机的MAC地址
从而无连接的通信建立了。
传输层协议为UDP。
3)IP地址为10.104.113.130的主机给请求端发送数据(首部为8字节;数据部分72字节):
以太网层使用的是MAC地址
网络层传输用的鉴别机制为IP地址。
NO.2:netstat命令测试系统网络状态的改变
netstat命令:
a)显示所有连接和侦听的端口:
b)应用程序对系统网络状态的改变:
NO.3:利用Windows Socket的API函数获取本机IP和指定域名的IP地址:
利用C#网络编程提供的API,完成获取本机IP地址和指定域名IP地址的任务。
代码及执行情况,见Src文件和exe文件。
using System;
using System.Collections.Generic;
using System.Text;
using ;
using .Sockets;
using System.Runtime.InteropServices;
namespace WindowsSocket_1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("请输入要查询域名");
string dnsName=Console .ReadLine();
IsNetConnecting netconnect = new IsNetConnecting();
bool NetConnect = netconnect.IsConnected();
Program winsocket=new Program();
if (NetConnect == true)
{
string localIP = winsocket.GetHostIP();
Console.WriteLine("本机IP地址:" + localIP);
winsocket.Resolve(dnsName);
for (int i = 0; i < winsocket.IPLength; i++)
Console.WriteLine("对应域名的IP地址[" + (i + 1) + "]为:" + winsocket.m_arrayIPs[i]);
}
else {
Console.WriteLine("当前网络连接不可用。
无法获取本机IP地址和指定域名的IP地址");
}
Console.Read();
}
#region 获取主机IP地址
public string GetHostIP(){
string strHostName = Dns.GetHostName(); //获取本地计算机名称
Console.WriteLine("本地计算机名:" + strHostName); //由本地计算机名称获取本机IP地址
IPHostEntry ipEntry = Dns.GetHostEntry(strHostName);
return ipEntry.AddressList[2].ToString(); //返回本机IP地址Console.ReadKey();
}
#endregion
#region 获取已知域名的IP地址
IPAddress[] m_arrayIPs;
public void Resolve(string s_host)
{
IPHostEntry ip = Dns.GetHostByName(s_host);
m_arrayIPs = ip.AddressList;
}
public IPAddress this[int nIndex] {
get {
return m_arrayIPs[nIndex];
}
}
public int IPLength
{
get{
return m_arrayIPs.Length;
}
}
#endregion
public class IsNetConnecting
{
#region 判断网络连接
[DllImport("wininet.dll")]
private extern static bool InternetGetConnectedState(out int connectionDescription, int reservedValue);
public bool IsConnected()
{
int I = 0;
bool state = InternetGetConnectedState(out I, 0);
return state;
}
#endregion
}
}
}
【实验中出现问题及解决方法】
i.在完成指定域名的IP获取时,有些域名能得到多个IP地址,刚开始以为是个Bug,经过上网查
了些资料才知道,有些域名是挂载在多个服务器上的,因而对应多个IP地址。
ii.当没有网络时,本机就没有互联网IP地址,也无法去获取对应域名的IP地址。
因而我进行了网络连接的判断,无网络连接时直接弹出提示。
【思考问题】
i.利用Windows Socket的API函数可以获得多个地址,(例如:127.0.0.1);但是只有一个是
互联网的IP地址,因而对获得的IP地址做了简单筛选。
ii.无网络连接时,也可以得到所谓IP地址(127.0.0.1)显然这个并不是真实的IP地址,应该是以本机为服务器所分配的IP地址。
iii.飞秋的网络通信过程为:为得到要发起会话的IP地址对应的主机的MAC地址,通过广播方式,将在局域网内部发送请求。
当与之IP地址对应的主机会将本机的MAC地址回应给请求方。
从
而建立无连接的通信。
这种方式是比较不安全的,因而在这请求过程中,是以广播方式完成
的,因而可能会遭受IP欺骗,进行通信。
而且采用UDP传输协议,缺乏必要的加密机制,
因此是不安全的。
成绩优良中及格不及格。