一 说明
c#-简单的局域网协议模拟1
上篇主要模拟的是“网络层”和“数据链路层”协议。
本篇把“应用层协议”和“传输层”协议
这里主要模拟的是协议在局域网处理的情况,以后会逐渐增加广域网的模拟
二 代码
using System;
using System.Collections.Generic;
namespace 网络模拟
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
LuYou luYou = new LuYou("luyou");
Pc p1 = new Pc("p1");
Pc p2 = new Pc("p2");
FTP fTP = new FTP();
Http http = new Http();
YinyYong yinyYong1 = new YinyYong("应用1");
yinyYong1.xieYi = fTP;
yinyYong1.duanKou = 1;
YinyYong yinyYong2 = new YinyYong("应用2");
yinyYong2.xieYi = http;
p1.anZhuangXieyi(fTP);
p1.anZhuangXieyi(http);
p1.anZhuangYingYong(yinyYong1);
p1.anZhuangYingYong(yinyYong2);
p2.anZhuangXieyi(fTP);
p2.anZhuangXieyi(http);
p2.anZhuangYingYong(yinyYong1);
p2.anZhuangYingYong(yinyYong2);
luYou.insertWangXian(p1);
luYou.insertWangXian(p2);
Console.WriteLine("ip 1 发送数据");
p1.sent("ni hao", 2,0);
Console.ReadLine();
}
}
// 应用层协议
public abstract class YinYongXieYi
{
public YinYongXieYi(string name)
{
this.name = name;
}
public string name;
public YinYongBao daBao(string data)
{
YinYongBao yinYongBao = new YinYongBao();
yinYongBao.data = data;
setTou(yinYongBao);
return yinYongBao;
}
public string jieBao(YinYongBao yinYongBao) {
return yinYongBao.data;
}
public abstract void setTou(YinYongBao yinYongBao);
}
public class FTP : YinYongXieYi
{
public FTP() : base("FTP") { }
public override void setTou(YinYongBao yinYongBao)
{
yinYongBao.yingYongXieyi = "FTP";
}
}
public class Http : YinYongXieYi
{
public Http() : base("Http") { }
public override void setTou(YinYongBao yinYongBao)
{
yinYongBao.yingYongXieyi = "Http";
}
}
// 应用层数据包-http/FTP
public class YinYongBao {
public string data;
public string yingYongXieyi;
}
// 传输层数据包-TCP/UDP
public class TcpBao
{
public YinYongBao yinYongBao;
public int duanKou;
}
// 网络层数据包-IP
public class IpBao
{
public TcpBao tcpBao;
public int ip;
}
// 数据链路层数据包
public class LianLuBao
{
public IpBao ipBao;
public string mac;
}
// 应用程序
public class YinyYong
{
public YinyYong(string name)
{
this.name = name;
}
private string name;
// 监听的端口
public int duanKou;
// 使用的协议
public YinYongXieYi xieYi;
public TcpBao daBao(string data)
{
TcpBao tcpBao = new TcpBao();
tcpBao.yinYongBao = xieYi.daBao(data);
tcpBao.duanKou = duanKou;
return tcpBao;
}
public void exe(TcpBao tcpBao) {
Console.WriteLine(name+"应用,"+ xieYi .name+ "协议" + "处理" +tcpBao.yinYongBao.data+"数据");
}
}
// 网络设备-网卡、路由器
public class SheBei {
public SheBei(string mac) {
this.mac = mac;
}
public int ip;
public string mac;
}
// 电脑
public class Pc: SheBei
{
List<YinYongXieYi> xieYis = new List<YinYongXieYi>();
List<YinyYong> yinyYongs = new List<YinyYong>();
// 协议安装
public void anZhuangXieyi(YinYongXieYi xieYi) {
xieYis.Add(xieYi);
}
// 安装应用
public void anZhuangYingYong(YinyYong yinyYong) {
yinyYongs.Add(yinyYong);
}
public Pc(string mac):base(mac) {
}
public LuYou luYou;
public void sent(string data, int ip,int yingYongId) {
TcpBao tcpBao = yinyYongs[yingYongId].daBao(data);
IpBao ipBao = new IpBao();
ipBao.ip = ip;
ipBao.tcpBao = tcpBao;
LianLuBao lianLuBao = new LianLuBao();
lianLuBao.mac = luYou.mac;
lianLuBao.ipBao = ipBao;
luYou.accept(lianLuBao);
}
public void accept(LianLuBao lianLuBao)
{
if (lianLuBao.mac == mac) {
Console.WriteLine("ip: "+ip+" 收到数据");
selectYingYong(lianLuBao.ipBao.tcpBao);
}
}
private void selectYingYong(TcpBao tcpBao)
{
foreach(YinyYong yinyYong in yinyYongs)
{
if(yinyYong.duanKou == tcpBao.duanKou)
{
yinyYong.exe(tcpBao);
}
}
}
}
// ip mac映射表-相当于arp协议的缓冲表
public class YingShe
{
public int ip;
public string mac;
public Pc pc;
}
// 路由器
public class LuYou : SheBei
{
public LuYou(string mac) : base(mac)
{
}
List<YingShe> list = new List<YingShe>();
// 插入网线
public void insertWangXian(Pc pc) {
YingShe yingShe = new YingShe();
yingShe.mac = pc.mac;
pc.ip = yingShe.ip = createIp();
yingShe.pc = pc;
pc.luYou = this;
list.Add(yingShe);
}
// 收到数据包的处理
public void accept(LianLuBao lianLuBao) {
if (lianLuBao.mac == mac)
{
Pc p = getPcBy(lianLuBao.ipBao.ip);
lianLuBao.mac = p.mac;
p.accept(lianLuBao);
}
}
// 根据ip地质获取实际主机
public Pc getPcBy(int ip) {
foreach (YingShe yingShe in list) {
if (ip == yingShe.ip) {
return yingShe.pc;
}
}
return null;
}
// 当插网线的时候为电脑分配ip
private int createIp() {
int index = 1;
foreach (YingShe yingShe in list) {
if (yingShe.ip >= index) {
index++;
}
}
return index;
}
}
}