UDP的初次实验

news/2024/5/18 11:52:23 标签: c#, socket, udp

UDP的初次实验

  • 一、一个简单的C#程序开始
  • 二、利用UDP套接字,向另一台计算机发送文本
  • 三、一个Form窗口来传递信息
  • 四、通过 wireshark抓包,对数据帧进行分析
  • 五、参考链接

一、一个简单的C#程序开始

使用VS2017创建一个c#控制台应用程序,记住一定是.NET Framework,至于为什么我也不知道了。(真的顶不住了,现在已经凌晨3.26。暂时不去搞懂了)。然后

我们在创建的工程项目程序中,敲入一下代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace easytest
{
    class Program
    {
        static void Main(string[] args)
        {
            int i = 1;
            while (i <= 50)
            {
                Console.WriteLine("hello cqjtu! 重交物联18级");
                i++;
            }
            
        }
    }
}

当然了,以上很多代码都是自带的,不用去改。

来康康效果(又回到了最初的黑框框)

在这里插入图片描述

二、利用UDP套接字,向另一台计算机发送文本

那么我用C#写出了一个输出50行文字的简单程序,但是!今天的重头戏是UDP。

(what’s UDP is?)

Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。(来自百度百科)

Internet 的传输层有两个主要协议,互为补充。无连接的是 UDP,它除了给应用程序发送数据包功能并允许它们在所需的层次上架构自己的协议之外,几乎没有做什么特别的事情。面向连接的是 TCP,该协议几乎做了所有的事情。(来自百度百科)

这样看来好像UDP貌似就是个废啊,所有的活都被TCP包干了已经。那么UDP到底有啥用。我也懒得去一一介绍了,给个链接自己看吧


好了,我们进入正题,来给另一台电脑发送刚刚的那50行文本

我们另外创建一个控制台程序Udptest,弄代码进去:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace UDPClient
{
    class Program
    {
        static void Main(string[] args)
        {
            byte[] data = new byte[1024];
            string input, stringData;

            //构建UDP 服务器
            Console.WriteLine("This is a Client, host name is TBM");

            //设置服务IP,设置UDP端口号
            IPEndPoint ip = new IPEndPoint(IPAddress.Parse("192.168.43.82"), 1316);

            //定义网络类型,数据连接类型和网络协议UDP
            Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

            string welcome = "hello! ";
            data = Encoding.ASCII.GetBytes(welcome);
            server.SendTo(data, data.Length, SocketFlags.None, ip);
            IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
            EndPoint Remote = (EndPoint)sender;

            data = new byte[1024];
            //对于不存在的IP地址,加入此行代码后,可以在指定时间内解除阻塞模式限制
            int recv = server.ReceiveFrom(data, ref Remote);
            Console.WriteLine("Message received from {0}: ", Remote.ToString());
            Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
            while (true)
            {
                string msg = "hello cqjtu! 重交物联2018级";
                int i = 1;
                while(i <= 50)
                {
                    server.SendTo(Encoding.ASCII.GetBytes(msg),Remote);
                    i++;
                }
                input = Console.ReadLine();
                if (input == "exit")
                    break;
                server.SendTo(Encoding.ASCII.GetBytes(input), Remote);
                data = new byte[1024];
                recv = server.ReceiveFrom(data, ref Remote);
                stringData = Encoding.ASCII.GetString(data, 0, recv);
                Console.WriteLine(stringData);
            }
            Console.WriteLine("Stopping Client.");
            server.Close();
        }

    }
}

这部分代码是客户端代码,也就是Sender,我要发送文本当然是使用客户端

以下是服务端代码,也就是接收方

跑起来试试,要先让服务端先跑,否则客户端发出消息后服务端还没有收到,就没了啊。

在这里插入图片描述

没有打开客户端的服务端

在这里插入图片描述

打开之后的服务端,开始疯狂接收数据__咳咳!转码原因,都是乱码?ASCII码不是乱玩的,他的电脑不关我事啦(下面的客户端//以下都是上图为服务端,下图为客户端)

在这里插入图片描述

咋们来输入点东东

在这里插入图片描述

在这里插入图片描述

好吧我的也是乱码,至此50个文本也就发送完了,还多亏了个‘2’

下面把服务器端的代码给出来

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace UDP
{
    class Program
    {
        static void Main(string[] args)
        {
            int recv;
            byte[] data = new byte[1024];

            //得到本机IP,设置TCP端口号         
            IPEndPoint ip = new IPEndPoint(IPAddress.Any, 1316);
            Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

            //绑定网络地址
            newsock.Bind(ip);

            Console.WriteLine("This is a Server, host name is ZXW");

            //等待客户机连接
            Console.WriteLine("Waiting for a client");

            //得到客户机IP
            IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
            EndPoint Remote = (EndPoint)(sender);
            recv = newsock.ReceiveFrom(data, ref Remote);
            Console.WriteLine("Message received from {0}: ", Remote.ToString());
            Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));

            //客户机连接成功后,发送信息
            string welcome = "hello ! ";

            //字符串与字节数组相互转换
            data = Encoding.ASCII.GetBytes(welcome);

            //发送信息
            newsock.SendTo(data, data.Length, SocketFlags.None, Remote);
            while (true)
            {
                data = new byte[1024];
                //发送接收信息
                recv = newsock.ReceiveFrom(data, ref Remote);
                Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
                newsock.SendTo(data, recv, SocketFlags.None, Remote);
            }
        }

    }
}

三、一个Form窗口来传递信息

创建一个Windows窗体应用,

在设计界面添加一个按钮Button,和一个输入框Box;

在Button1_Click加入代码:

byte[] data = new byte[1024];
            string input;


            IPEndPoint ip = new IPEndPoint(IPAddress.Parse("192.168.43.82"), 1316);

            //定义网络类型,数据连接类型和网络协议UDP
            Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);


            server.SendTo(data, data.Length, SocketFlags.None, ip);
            IPEndPoint sende = new IPEndPoint(IPAddress.Any, 0);
            EndPoint Remote = (EndPoint)sende;

            data = new byte[1024];
            //对于不存在的IP地址,加入此行代码后,可以在指定时间内解除阻塞模式限制
            int recv = server.ReceiveFrom(data, ref Remote);
         


            input = textBox1.Text;
                if (input == "exit")
                    server.Close();
            server.SendTo(Encoding.ASCII.GetBytes(input), Remote);
            server.Close();

在CS的main函数下添加代码:

byte[] data = new byte[1024];

            //构建TCP 服务器
            Console.WriteLine("This is a Client, host name is TBM");

            //设置服务IP,设置TCP端口号
            IPEndPoint ip = new IPEndPoint(IPAddress.Parse("192.168.43.82"), 1316);

            //定义网络类型,数据连接类型和网络协议UDP
            Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

            string welcome = "success connect! ";
            data = Encoding.ASCII.GetBytes(welcome);
            server.SendTo(data, data.Length, SocketFlags.None, ip);
            IPEndPoint sende = new IPEndPoint(IPAddress.Any, 0);
            EndPoint Remote = (EndPoint)sende;

            data = new byte[1024];
            //对于不存在的IP地址,加入此行代码后,可以在指定时间内解除阻塞模式限制
            int recv = server.ReceiveFrom(data, ref Remote);
            Console.WriteLine("Message received from {0}: ", Remote.ToString());
            Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));

在另一端电脑上开启服务端,然后再开启客户端

在这里插入图片描述

在这里插入图片描述

输入数字1,点击发送

在这里插入图片描述

在这里插入图片描述

四、通过 wireshark抓包,对数据帧进行分析

在这里插入图片描述

筛选UPD包,抓住后,由此可以看见,从我的电脑IP192.168.43.100,自动分配的端口60659,向192.168.43.82的端口1316,发送了包,

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

五、参考链接

  • TCP和UDP的区别和优缺点
  • 基于C#的UDP协议的同步实现
  • C#使用UdpClient类进行简单通信的例子
  • UDP协议与Wireshark实验
  • 基于C#的UDP协议的同步实现
  • C#使用UdpClient类进行简单通信的例子
  • UDP协议与Wireshark实验

http://www.niftyadmin.cn/n/1295202.html

相关文章

再进一步,在Ubuntu下使用可视化软件进行调试应用

一、在Ubuntu下安装Vs Code 打开Ubuntu&#xff0c;在Ubuntu软件下&#xff0c;直接搜索VS Code,在找到的软件中直接打开并安装即可 静候安装完成即可。 二、利用Vs Code进行可视化调试 1️⃣、进行环境搭建和配置 在扩展中搜索‘c’就OK&#xff0c;install它&#xff0c;如…

shell中单引号、双引号、反引号的使用

2019独角兽企业重金招聘Python工程师标准>>> 在编写shell脚本时&#xff0c;会经常地使用到单引号、双引号、反引号这些特殊的符号。它们在shell中有着不同的作用&#xff0c;但容易被误用和引起混乱。简单总结一下三者的使用和区别。 单引号 它关闭shell中所有的特…

网络通讯的远程操作

一、Ubuntu下的远程连接 ①将Ubuntu设置为 “桥接模式”&#xff0c;配置UbuntuIP&#xff0c;等网关参数&#xff0c;ping通我的Ubuntu 设置好“网桥模式”后&#xff0c;输入命令ifconfig查询自己的ubuntuIP ifconfig在另一台电脑上&#xff08;局域网下&#xff09;ping上…

MVC的Ajax传值问题

今天发现&#xff0c;如果用Ajax跟EF对数据进行删除的时候遇到的问题&#xff0c;刚开始是一直报一个错&#xff1a;“无法更新 EntitySet“Ips_Articles”&#xff0c;因为它有一个 DefiningQuery&#xff0c;而 <ModificationFunctionMapping> 元素中没有支持当前操作的…

C#实现端口扫描小程序

C#实现端口扫描小程序一、UI界面设计二、使用单一进程实现端口扫描三、使用多线程实现端口扫描四、总结五、参考链接一、UI界面设计 工具使用&#xff1a;VS2017 ①使用VS2017新建一个Windows窗体应用&#xff08;.NET Framework)项目 ②在Program.cs中设计窗口形式如下 完成各…

APUE 第三章习题 3.2 浅析

题目描述&#xff1a;编写一个与3.12节中dup2功能相同的函数&#xff0c;要求不能调用fcntl函数&#xff0c;并且有正确的出错处理。 题目分析&#xff1a;既然不能使用fcntl函数&#xff0c;那么我们就需要使用其他函数来达到类似的目的&#xff0c;这里列举出所有我们需要使用…

用C#实现网络游戏客户端

用C#实现网络游戏客户端一、在win10下用telnet进行测试二、UI设计三、主要代码实现四、效果展示五、参考六、总结一、在win10下用telnet进行测试 ①打开cmd&#xff0c;在能够ping通10.160.52.106&#xff08;该ip是校园的内网ip&#xff0c;不在内网还是ping不通的&#xff0…

Teardrop攻击——发送虚假IP包信息

Teardrop攻击——发送虚假IP包信息一、原始套接字概述二、Teardrop攻击原理阐述三、编写Teardrop程序&#xff08;伪造一个虚假地址的IP包&#xff09;四、参考链接一、原始套接字概述 原始套接字&#xff0c;指在传输层下面使用的套接字。流式套接字和数据报套接字这两种套接字…