c#-简单的局域网协议模拟2

本文通过C#实现了一个局域网协议的模拟,包括网络层、数据链路层、应用层协议和传输层协议的模拟。演示了数据如何在两台装有FTP和HTTP协议的电脑间传输。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 说明

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;
        }
    }
}

三 运行效果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值