添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

一、控制台实现udp通信

本次采用c/s模式创建应用实现通信。
1)创建项目
在VS2019中选择创建新项目,选择.net framework控制台应用,设置项目名并选择项目存储位置,然后点击创建,即可建立一个基本的控制台应用。
2)编写服务端
获取udp连接代码如下

            UdpClient client = new UdpClient();
            //设置目标ip地址,127.0.0.1为本地回环,即自己发给自己
            IPAddress remoteIP = IPAddress.Parse("127.0.0.1");
            //设置端口号
            int remotePort = 11000;  
            IPEndPoint remotePoint = new IPEndPoint(remoteIP, remotePort);

发送数据使用client.Send(sendData, sendData.Length, remotePoint);,在发送之前需要使用Encoding.Default.GetBytes把将发送的数据转为16进制编码格式。
完整main函数代码如下:

            //提示信息
            Console.WriteLine("按下任意按键开始发送...");
            Console.ReadKey();
            int m;
            //做好链接准备
            UdpClient client = new UdpClient();  //实例一个端口
            IPAddress remoteIP = IPAddress.Parse("127.0.0.1");  //假设发送给这个IP
            int remotePort = 11000;  //设置端口号
            IPEndPoint remotePoint = new IPEndPoint(remoteIP, remotePort);  //实例化一个远程端点 
            for (int i = 0; i < 50; i++)
                //要发送的数据:第n行:hello cqjtu!重交物联2019级
                string sendString = null;
                sendString += "第";
                m = i + 1;
                sendString += m.ToString();
                sendString += "行:hello cqjtu!重交物联2019级";
                //定义发送的字节数组
                //将字符串转化为字节并存储到字节数组中
                byte[] sendData = null;
                sendData = Encoding.Default.GetBytes(sendString);
                client.Send(sendData, sendData.Length, remotePoint);//将数据发送到远程端点 
            client.Close();//关闭连接
            //提示信息
            Console.WriteLine("");
            Console.WriteLine("数据发送成功,按任意键退出...");
            System.Console.ReadKey();

3)编写客户端
同样创建一个新项目,main函数内代码如下

            int result;
            string str = "第50行:hello cqjtu!重交物联2019级";
            UdpClient client = new UdpClient(11000);
            string receiveString = null;
            byte[] receiveData = null;
            //实例化一个远程端点,IP和端口可以随意指定,等调用client.Receive(ref remotePoint)时会将该端点改成真正发送端端点 
            IPEndPoint remotePoint = new IPEndPoint(IPAddress.Any, 0);
            Console.WriteLine("正在准备接收数据...");
            while (true)
                receiveData = client.Receive(ref remotePoint);//接收数据 
                receiveString = Encoding.UTF8.GetString(receiveData);
                Console.WriteLine(receiveString);
                result = String.Compare(receiveString, str);
                if (result == 0)
                    break;
            client.Close();//关闭连接
            Console.WriteLine("");
            Console.WriteLine("数据接收完毕,按任意键退出...");
            System.Console.ReadKey();

4)测试
同时运行这两个应用,进行测试,测试结果如下:
请添加图片描述

二、图像界面实现发送信息

1).创建项目
选择下图所示项目模板,创建项目。打开后即进入界面设计。
在这里插入图片描述
在其中从工具栏中加入一个按钮,一个文本框和一个富文本框,按自己想法放置。
2)双击添加进的按钮。进入代码编辑界面。按钮点击代码如下

        private void button1_Click(object sender, EventArgs e)
            UdpClient client = new UdpClient();
            IPAddress remoteIP = IPAddress.Parse("127.0.0.1");
            int remotePort = 11000;  //设置端口号
            IPEndPoint remotePoint = new IPEndPoint(remoteIP, remotePort);
            string text = textBox1.Text;
            byte[] sendData = null;
            sendData = Encoding.Default.GetBytes(text);
            client.Send(sendData, sendData.Length, remotePoint);//将数据发送到远程端点 
            client.Close();//关闭连接
            //提示信息
            richTextBox1.Text+="数据已发送\n";

3)测试
测试结果如下:
请添加图片描述

3.端口扫描器实现

1)创建项目,设计界面
按前面所说创建桌面应用项目,界面设计如下:
在这里插入图片描述

2)输入端口信息获取及进度条相关配置
在代码中创建一个新函数。将端口相对应文本输入框的textchanged事件绑定为该函数。在class中创建两个私有成员变量,保存相关信息。代码如下

        private void TextBox3_TextChanged(object sender, EventArgs




    
 e)
            try {
                progressBar1.Value = start; 
            catch
                progressBar1.Minimum = 0;
                progressBar1.Maximum = 65535;
                progressBar1.Value = 0;
            string text= "-1" ;
            TextBox temp= (TextBox)sender;
            if(temp.Text.Length !=0)
                text = temp.Text;
            if (temp == textBox3 && !text.Equals("-1"))
                label4.Text = text;
                start = Int32.Parse(text);
            else if (temp == textBox2 && !text.Equals("-1"))
                label5.Text = text;
                end = Int32.Parse(text);
                progressBar1.Minimum = start;
                progressBar1.Maximum = end;
                if(end < start || end >65536 || start < 0 || start > 65536)
                    richTextBox1.Text += "\n输入有误,请重新输入!\n";
                    textBox3.Clear();
                    textBox2.Clear();
                    label4.Text = "";
                    label5.Text = "";
                    start = 0;
                    end = 0;

2.单线程扫描实现

双击单线程对应按钮,进入代码编辑界面。相关代码如下:

        private void Clicked(object sender, MouseEventArgs e)
            progressBar1.Value = start;
            if (textBox1.Text == null)
                richTextBox1.Text += "\n请输入ip地址\n";
                return;
                addr = textBox1.Text;
            TcpClient obj = null;
            richTextBox1.Text += "\n开始扫描!\n";
            while (progressBar1.Value != progressBar1.Maximum) {
                try {
                    obj = new TcpClient(addr, progressBar1.Value);
                } catch
                finally
                    progressBar1.Value += 1;
                richTextBox1.Text += "\n扫描结束\n";

在实际使用时,如果使用单线程,等待时间将会较长,同时,扫描时也不能对该窗口进行任何操作,否则将会卡死,使用体验较差。

多线程扫描实现

先在class中定义两个私有线程变量。然后双击多线程对应按钮,进入代码编辑界面。
相关代码如下

        private void button2_Click(object sender, EventArgs e)
            progressBar1.Value = start;
            if (textBox1.Text == null)
                richTextBox1.Text += "\n请输入ip地址\n";
                return;
                addr = textBox1.Text;
            richTextBox1.Text = "端口扫描器\n";
            richTextBox1.Text += "\n开始扫描!\n";
            Thread startscan = new Thread(new ThreadStart(scan));
            startscan.Start();

scan:

        public void scan()
            bool flag = false;
            for(int i = start; i <= end; i++)
                port = i;
                scans = new Thread(new ThreadStart(truescan));
                scans.Start();
                System.Threading.Thread.Sleep(100);
            while(!flag){
                for(int i = start; i <= end; i++)
                    if (!ischecked[i])
                        flag = false;
                        System.Threading.Thread.Sleep(100);
                        break;
                    flag = true;
            End temp = new End(scanEnd);
            this.Invoke(temp);

truescan:

        public void truescan()
            int temp = port;
            Thread now = scans;
            TcpClient obj = null;
                obj = new TcpClient(addr, temp);
                setText temp1 = new setText(portOpen);
                this.Invoke(temp1,temp);
            catch
                setText temp1 = new setText(portNotOpen);
                this.Invoke(temp1,temp);
            finally
                ischecked[temp] = true;
                End temp1 = new End(gogo);
                if(temp!=start)
                    this.Invoke(temp1);

在c#中,如果需要在某一线程中操作非本线程创建的控件时,需要使用委托来实现相关操作。本次定义使用的相关定义代码如下

        public delegate void setText(int t);
        public delegate void End();

在使用前,将这些通过new 与相关处理函数绑定,再在子线程中通过invoke调用,传递参数。本次定义的处理函数如下:

       public void portOpen(int temp)
            richTextBox1.Text += "\n端口" + temp + "开放\n";
        public void portNotOpen(int temp)
            richTextBox1.Text += "\n端口" + temp + "未开放\n";
        public void scanEnd()
            richTextBox1.Text += "扫描结束";
        public void gogo()
            progressBar1.Value++;

3)测试
测试结果如下
请添加图片描述

4.udp数据帧分析

使用前面的发送软件发送信息,通过抓包软件得到数据包如下
在这里插入图片描述
如果发送到其他电脑,第二行应与以下图片相似。
在这里插入图片描述
第一行为目标地址,第二行为源地址,第三行为类型,即采用的协议,第四行为校验码。
第三行为ip包。如下所示
在这里插入图片描述
包含以下内容

  1. Version(版本号):分为 IPv4 和 IPv6 这里用的 IPv4 ,所以值为 4 ,1 个字节
  2. Header length(ip报头长度):32位字的报头长度
  3. TOS(级别):服务类型描述数据报将如何被处理,比如优先发送等,大多数都是默认为 0
  4. Total Length(总长度):包括报头和数据的数据包长度
  5. identifier(标识):唯一的 IP 数据包值
  6. Flags(标志):说明是否有数据被分段,由于本次每个包的数据很小,没有被分段,所以这里数值为 0 。
  7. Fragmentation Offset(分段偏移):如果数据包在装人帧时太大,则需要进行分段和重组,这里没有分段,所以偏移量为 0
  8. TTL(存活期):存活期是在数据包产生时建立在其内部的一个设置,如果这个数据包在这个TTL到期时仍没有到达它要去的目的地,那么它将被丢弃,这个设置将防止IP包在寻找目的地的时候在网络中不断循环,每经过一个路由器,它的值就减一,这里它的值为 64 ,也就是 64 个生存期
  9. Protocol(协议):上层协议的端口( TCP 是端口 6;UDP 是端口 17) ,同样也支持网络层协议,如ARP和ICMP,这里值为 17 ,也就是 UDP 协议
  10. Header Checksum(校验码):只针对报头的循环冗余校验(CRC)
  11. 目的地址及源地址
    最后一行为数据,里面是发送的数据字节,如果发送的数据含有中文,通过utf-8编码格式解码后即可看到完整数据。
c#验证udp协议通信及实现端口扫描器一、控制台实现udp通信二、图像界面实现发送信息3.端口扫描器实现2.单线程扫描实现多线程扫描实现4.udp数据帧分析一、控制台实现udp通信本次采用c/s模式创建应用实现通信。1)创建项目在VS2019中选择创建新项目,选择.net framework控制台应用,设置项目名并选择项目存储位置,然后点击创建,即可建立一个基本的控制台应用。2)编写服务端获取udp连接代码如下 UdpClient client = new UdpCli
计算机信息网络的发展加速了信息化时代的进程,但是随着社会网络化程度的增加,对计算机网络的依赖也越来越大,网络安全问题也日益明显。端口扫描技术是发现安全问题的重要手段之一。一个端口就是一个潜在的通信通道,也就是一个入侵通道。对目标计算机进行端口扫描,能得到许多有用的信息。扫描通过选用远程TCP/IP不同的端口的服务,并记录目标给予的回答,通过这种方法,可以搜集到很多关于目标主机的各种有用的信息,从而发现目标机的某些内在的弱点。 编写一个简单的主机端口扫描程序,要求能够探测目的主机的端口状态。 (1)要求用户可以在参数中输入需要扫描的目的主机的IP地址与端口,输出端口的状态信息。 (2)要求使用UDP协议进行端口的扫描过程。 (3)有良好的编程规范与注释信息。
之前项目需要检测远端状态,起初尝试通过检测远端端口来实现,后方发现项目不适用改用其它方便,这里发出了给有需要的人。 原理:发送UDP报文到指定端口,如果该端口没有绑定UDP监听会反馈ICMP,有绑定则无返回。 实现流程,打开ICMP监听,给远端的端口发送UDP报文,如果收到ICMP反馈,说明该端口没有UDP监听,未收到反馈说明该端口有UDP检测(不考虑网络异常等特殊情况)。 string _localIP = “192.1.3.125”;//本地IP string _serverIP = “192
利用python的socket库写了一个udp端口扫描的脚本 什么是 Socket? Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。 直接上代码 import sys,time import socket def scan(host,port): print("") print('Server %s,Port:%s is scaning'%(host,port)) #打印ip和端口
ipv4数据报文中修改的来源ip或目的ip后,一般需要修改对应的校验码。首先ip校验码是最基础的,然后因为TCP/UDP对应的校验码会根据伪报文头检查(其中包含src ip 和 dst ip),所以也需要修改tcp/udp报文的校验码。这里修复了一些其他文章中的BUG,例如缓存溢出、构造TCP/UDP伪报文采用的参数等,通过实验能够正常运行。 1.IP检验码 unsigned int Che...
C语言是一种通用的、面向过程的编程语言,由Dennis Ritchie在20世纪70年代早期开发。C语言被广泛应用于系统程序设计、嵌入式系统、游戏开发、科学计算等领域。 C语言的特点包括语法简洁、执行效率高、可移植性好、灵活性强等。在C语言中,程序是由函数组成的,每个函数都是由一系列语句组成的。C语言中提供了大量的库函数,这些函数可以方便地实现各种常用的操作。 C语言也有一些限制,比如不支持面向对象编程,对内存管理要求较高等。但是,C语言是学习计算机科学和程序设计的重要语言之一,也是许多其他编程语言的基础。