C#编程并实现网络UDP套接字

一、UDP介绍

UDP是User Datagram Protocol的简称,中文名是用户数据报协议,是OSI参考模型中的传输层协议,它是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。

UDP的优势:
①开销更小
TCP为了保证其可靠性,首部包含20字节,以及40字节的可选项,UDP首部只有8字节;
②速度更快
UDP发送数据之前没有TCP的连接建立过程;
TCP提供了过多的保护,在及时性上做了很多的妥协,比如:控制微包(Nagle算法),延时ACK,流量控制,超时重传等,这些设计严重影响了Tcp的速度和及时性。

二、C#命令行/控制台hello world程序

(一)创建项目

选择控制台应用
在这里插入图片描述

(二)客户端程序

源代码:

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

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

            //构建TCP 服务器
            Console.WriteLine("这是客户端,请键入要发送的数据, 主机名为: {0}", Dns.GetHostName());

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

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

            string welcome = "连接成功!";
            //字符串与字节数组相互转换
            data = Encoding.Default.GetBytes(welcome);
            //发送信息
            client.SendTo(data, ip);

            IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
            EndPoint Remote = (EndPoint)sender;

            data = new byte[1024];
            //对于不存在的IP地址,加入此行代码后,可以在指定时间内解除阻塞模式限制
            //接受信息
            int recv = client.ReceiveFrom(data, ref Remote);
            //输出服务端ip
            Console.WriteLine("消息发送到: {0}: ", Remote.ToString());
            //输出接受到的信息
            Console.WriteLine(Encoding.Default.GetString(data, 0, recv));
            while (true)
            {
                //读取屏幕的字符串存入input中
                input = Console.ReadLine();
                if (input == "exit")
                    break;
                //将input中的字符串发送至服务端
                for (int i = 0; i < 50; i++)
                {
                    client.SendTo(Encoding.Default.GetBytes(input), Remote);
                }

                /*
                data = new byte[1024];
                //将接受自服务端的信息存入recv中
                recv = client.ReceiveFrom(data, ref Remote);
                //将字节流转为字符串
                string Data = Encoding.Default.GetString(data, 0, recv);
                //将Date中的数据打印到屏幕上
                Console.WriteLine(Data);*/
            }
            //输入exit后,屏幕打印下列字符串
            Console.WriteLine("Stopping Client.");
            //关闭服务端
            client.Close();
        }

    }
}

结果如下:
在这里插入图片描述

(三)服务端程序

源代码:

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;

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

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

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

            Console.WriteLine("这是客户端, 主机名为: {0}", Dns.GetHostName());

            //等待客户机连接
            Console.WriteLine("等待客户端发送数据...");

            //得到客户机IP
            IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
            EndPoint Remote = (EndPoint)(sender);
            recv = server.ReceiveFrom(data, ref Remote);
            Console.WriteLine("消息来自于: {0}: ", Remote.ToString());
            Console.WriteLine(Encoding.Default.GetString(data, 0, recv));

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

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

            //发送信息 
            server.SendTo(data, Remote);



            while (true)
            {
                data = new byte[1024];
                //发送接收信息
                //从客户机接受消息
                recv = server.ReceiveFrom(data, ref Remote);
                //将字节流信息转换为字符串
                string Data = Encoding.Default.GetString(data, 0, recv);
                //将字符串输出到屏幕上
                Console.WriteLine(Data);
                // Console.WriteLine(Encoding.Default.GetString(data, 0, recv));
                /*
                //定义字符串input
                string input;
                //读取屏幕上的字符串
                input = Console.ReadLine();
                if (input == "exit")
                    break;
                //将input发送至客户机
                server.SendTo(Encoding.Default.GetBytes(input),Remote);*/
            }
            server.Close();
        }

    }
}

结果为:

在这里插入图片描述

(四)使用wireshark抓包

发送数据时
在这里插入图片描述
这是我向舍友发送数据时抓到的包,可以见到源地址为10.61.131.59,这是我电脑的地址,目的地址为10.61.27.46,这是我舍友电脑的地址,端口为8000,数据为11字节,数据内容为hello world,协议为UDP。

接受数据:
在这里插入图片描述这是舍友抓到的包,源地址是我电脑的地址,目的地址是她电脑的地址,协议是UDP,端口为8000,内容为hello world,数据为11字节。

三、C#Form窗口程序

(一)创建项目

新建项目,选择Windows窗体应用。
在这里插入图片描述

(二)客户端程序

  1. 窗体设计
    在这里插入图片描述
  2. 代码部分
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net.Sockets;

namespace demo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            UdpClient udpSender = new UdpClient(0);
            udpSender.Connect("192.168.43.165", 8000);
            string message = textBox1.Text;
            byte[] sendBytes = Encoding.UTF8.GetBytes(message);
            udpSender.Send(sendBytes, sendBytes.Length);
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }
    }
}

最近电脑坏了,拿去修了,所以用的舍友的电脑。现在的IP是“192.168.43.205”,舍友的IP是“192.168.43.165”

运行结果:
在这里插入图片描述

(三)服务端程序

服务端程序用上面的就行,这里就不写了,接下来是运行结果
在这里插入图片描述
这是在舍友电脑上截到的图。

(四)wireshark抓包

客户端:
在这里插入图片描述
这是我抓到的包,源地址是192.168.43.205,目的地址是192.168.43.165,使用协议为UDP,端口号为8000,长度为11字节,数据内容为hello world.
服务端:

在这里插入图片描述
这是舍友抓到的包,源地址就是192.168.43.205,目的地址为192.168.43.165.内容为hello world,11字节,端口号为11,使用协议为UDP。

四、参考

  1. UDP简介
  2. 初识C#网络编程
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值