一、用C#编写客户端(Client)
a.
打开 VS2017 新建一个 C# 的控制台程序
![](https://i-blog.csdnimg.cn/blog_migrate/87a3e337fdca65f894ff7b14ad87cff6.png)
b.
将解决方案中的 Program.cs 重命名为 Client.cs
c.
在 Client.cs 中写入如下内容:
using System;
using System.Net.Sockets;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Client
{
static void Main(string[] args)
{
for(int i = 0; i < 50; i++)
{
Console.WriteLine("木叶飞舞之处,火亦生生不息!!!");
}
// 创建一个UdpClient对象,0表示系统自动分配发送端口
UdpClient udpSender = new UdpClient(0);
// 连接到服务端并指定接收端口
udpSender.Connect("服务器公网IP", 5000);
for(int i = 0; i < 50; i++)
{
// 编码格式为 utf-8
byte[] sendBytes = Encoding.UTF8.GetBytes("木叶飞舞之处,火亦生生不息!!!");
// 把消息转换成字节流发送到服务端
udpSender.Send(sendBytes, sendBytes.Length);
}
byte[] over = Encoding.UTF8.GetBytes("stop");
udpSender.Send(over, over.Length);
// 按任意键退出
Console.ReadKey();
}
}
}
注意将 udpSender.Connect(“服务器公网IP”, 5000) 中的 服务器公网IP 换成自己的 IP 地址,如果是本地测试的话,只需换成 localhost 即可
二、配置服务端(Server)
服务器我选用的是阿里云的轻量应用服务器,因为租用的时间还没有到期,正好可以用来做这次实验😁
服务器系统选用的是:Ubuntu18.04
a.
首先进入轻量应用服务器管理控制平台,然后远程连接
b.
环境的配置
这里的服务端选用的是 Python 实现的,原因是配置简单,还有就是 C# 对 Linux 的支持没有对 Windows 的那么好
-
python 版本的查看(一般默认的是python2的版本)
python --version pip --version python3 --version # 查看python3的版本
-
安装 python3-pip
sudo apt-get update sudo apt-get install python3-pip
-
将默认的 python(python2)版本更改为 python3 版本
sudo rm /usr/bin/python # 删除默认的python链接 sudo ln -s /usr/bin/python3.6 /usr/bin/python # 新建python链接指向python3版本
注意:我的 python3 的版本为 3.6,这里需换成自己的 python3 版本。
然后再次用 –version 查看版本信息,会发现已经更改为 python3 的信息
然而,用 pip --version 查看版本信息时也许会报 ModuleNotFoundError: No module named ‘pip._internal’ 的错
解决办法:
sudo vim /usr/local/bin/pip
将 from pip._internal import main 改成 from pip import main
修改后,再次查看信息:
-
在 home 目录下,新建一个 test 文夹,并在该文件夹中新建 Server.py:
cd ~ mkdir test cd test sudo vim Server.py
并写入如下内容:
from socket import * # 创建套接字 udp_socket = socket(AF_INET, SOCK_DGRAM) # ip地址和端口号,ip一般不用写,表示本机的任何一个ip local_addr = ('', 5000) udp_socket.bind(local_addr) print("等待连接") while True: # 等待接收对方发送的数据,1024表示能接收的最大字节数 recv_data = udp_socket.recvfrom(1024) recv_result = recv_data[0].decode('utf-8') if recv_result == 'stop': print("连接已断开") break print(recv_result) udp_socket.close()
c.
测试
先运行服务端(Server),然后在运行客户端(Client)
在运行服务端之前需要先开启 5000 端口,在控制台中操作如下:
![](https://i-blog.csdnimg.cn/blog_migrate/358e9d65918f66a12f1a0abee93c816b.png)
运行服务端:
![](https://i-blog.csdnimg.cn/blog_migrate/ee62f788ae0d6942b8c41a34d29babf6.png)
运行客户端,并查看服务端是否接收数据
![](https://i-blog.csdnimg.cn/blog_migrate/cc476a8be9902709cbe9649cb5e39ebc.png)
三、用C#编写一个简单的Form窗口程序
a.
创建一个 Windows 窗体应用(.NET Framework) 项目
![](https://i-blog.csdnimg.cn/blog_migrate/9868dd09fdbb746cb758a2b16804a4a1.png)
如果没有需要重新安装一下
勾选 .NET 桌面开发 中如下选项:
![](https://i-blog.csdnimg.cn/blog_migrate/1bb2af75d08549d5b541c891073dddb2.png)
b.
设计 Form1 窗体如下
![](https://i-blog.csdnimg.cn/blog_migrate/8fd491df171d71ece300ecd9a5b8b4d3.png)
c.
修改 Form.cs:
-
引入如下头文件:
using System.Net.Sockets;
-
修改 button1_Click 函数如下:
private void button1_Click(object sender, EventArgs e) { UdpClient udpSender = new UdpClient(0); udpSender.Connect("39.106.160.34", 5000); string message = textBox1.Text; byte[] sendBytes = Encoding.UTF8.GetBytes(message); udpSender.Send(sendBytes, sendBytes.Length); }
d.
测试
![](https://i-blog.csdnimg.cn/blog_migrate/c23c21c926407e619274551496a6014a.gif)
四、通过 wireshark抓包,对数据帧进行分析
筛选出 UDP 数据包
![](https://i-blog.csdnimg.cn/blog_migrate/57a56a85b8884b4187cbae06b39d49cf.png)
Ethernet II, Src: 数据链路层以太网帧头部信息
![](https://i-blog.csdnimg.cn/blog_migrate/6409efa078c154fb5f33927785e3d180.png)
Internet Protocol Version 4, Src: 互联网层IP包头部信息
![](https://i-blog.csdnimg.cn/blog_migrate/e4cc0a370209b29192ba76452f26083b.png)
User Datagram Protocol:UDP协议
每个报头字段为 2字节,因此 UDP 报头为 8字节,数据报长度 = 报头长度(8字节) + 报文长度(48字节) = 56字节
![](https://i-blog.csdnimg.cn/blog_migrate/bbf9db2601158b50ba2e4ff60f39af82.png)
Data:数据包
![](https://i-blog.csdnimg.cn/blog_migrate/ef778a4649067b28a9f04c9891dc23d4.png)