C#的Socket实现UDP协议通信的示例代码详解


当前第2页 返回上一页

关键的全局变量

1

2

3

4

private IPEndPoint ipLocalPoint;

private EndPoint RemotePoint;

private Socket mySocket;

private bool RunningFlag = false;

获取本地IP的方法

1

2

3

4

5

6

7

8

9

10

private string getIPAddress()

 {

   // 获得本机局域网IP地址

   IPAddress[] AddressList = Dns.GetHostByName(Dns.GetHostName()).AddressList;

   if (AddressList.Length < 1)

   {

     return "";

   }

   return AddressList[0].ToString();

 }

IP与端口号有效验证

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

private int getValidPort(string port)

  {

    int lport;

    //测试端口号是否有效

    try

    {

      //是否为空

      if (port == "")

      {

        throw new ArgumentException(

          "端口号无效,不能启动DUP");

      }

      lport = System.Convert.ToInt32(port);

    }

    catch (Exception e)

    {

      //ArgumentException, 

      //FormatException, 

      //OverflowException

      Console.WriteLine("无效的端口号:" + e.ToString());

      this.tbMsg.AppendText("无效的端口号:" + e.ToString() + "\n");

      return -1;

    }

    return lport;

  }

  

  

  private IPAddress getValidIP(string ip)

  {

    IPAddress lip = null;

    //测试IP是否有效

    try

    {

      //是否为空

      if (!IPAddress.TryParse(ip, out lip))

      {

        throw new ArgumentException(

          "IP无效,不能启动DUP");

      }

    }

    catch (Exception e)

    {

      //ArgumentException, 

      //FormatException, 

      //OverflowException

      Console.WriteLine("无效的IP:" + e.ToString());

      this.tbMsg.AppendText("无效的IP:" + e.ToString() + "\n");

      return null;

    }

    return lip;

  }

Socket的配置

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

//得到本机IP,设置UDP端口号  

ip = getValidIP(tbLocalIP.Text);

port = getValidPort(tbLocalPort.Text);

ipLocalPoint = new IPEndPoint(ip, port);

  

//定义网络类型,数据连接类型和网络协议UDP

mySocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

  

//绑定网络地址

mySocket.Bind(ipLocalPoint);

  

//得到客户机IP

ip = getValidIP(tbRemoteIP.Text);

port = getValidPort(tbRemotePort.Text);

IPEndPoint ipep = new IPEndPoint(ip, port);

RemotePoint = (EndPoint)(ipep);

  

//启动一个新的线程,执行方法this.ReceiveHandle,

//以便在一个独立的进程中执行数据接收的操作

  

RunningFlag = true;

Thread thread = new Thread(new ThreadStart(this.ReceiveHandle));

thread.Start();

接收线程

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

//定义一个委托

public delegate void MyInvoke(string strRecv);

private void ReceiveHandle()

{

  //接收数据处理线程

  string msg;

  byte[] data=new byte[1024];

  MyInvoke myI = new MyInvoke(UpdateMsgTextBox);

  while (RunningFlag)

  {

      

    if (mySocket == null || mySocket.Available < 1)

    {

      Thread.Sleep(200);

      continue;

    }

    //跨线程调用控件

     //接收UDP数据报,引用参数RemotePoint获得源地址

     int rlen = mySocket.ReceiveFrom(data, ref RemotePoint);

    msg = Encoding.Default.GetString(data, 0, rlen);

    tbMsg.BeginInvoke(myI, new object[]{RemotePoint.ToString() + " : " + msg});

      

  }

}

private void btSend_Click(object sender, EventArgs e)

{

  string msg;

  msg = tbSendMsg.Text;

  //发送UDP数据包

  byte[] data = Encoding.Default.GetBytes(msg);

  mySocket.SendTo(data, data.Length, SocketFlags.None, RemotePoint);

}

private void UpdateMsgTextBox(string msg)

{

  //接收数据显示

  this.tbMsg.AppendText( msg + "\n");

}

以上只需设置好本地和远程的IP和端口号,很容易就实现了UDP的双向通信。虽说UDP数据包不能保证可靠传输,网络繁忙、拥塞等因素,都有可能阻止数据包到达指定的目的地。但经过测试,其通信还蛮可靠的,别忘了QQ也是利用UDP进行即时通信的。

以上就是C#的Socket实现UDP协议通信的示例代码详解的详细内容!

返回前面的内容

相关阅读 >>

C#如何计算2个字符串相似度的示例代码分享

详细介绍C# 利用irawpixels接口遍历栅格数据的代码实例

C#获取系统当前鼠标的图案示例代码

C#二进制字节数组操作函数 截取字节数组subbyte的示例代码

详细介绍C# string格式的日期时间字符串转为datetime类型的方法

C#开发之winform(公共控件)

C#中如何取绝对值函数的方法详解

C#学习记录:编写高质量代码改善整理建议4-8

C#实现char字符数组与字符串相互转换的方法详解

C# tabcontrol组件如何切换显示form窗体的示例代码

更多相关阅读请进入《C#》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...