差不多有一个礼拜总算有点进步。

代码很简单,只是为了实现功能。

网络上的资源是很多,除了不能用的,就是抄来抄去,是在乏味浪费时间。

说一下代码背景:实现的功能是发送端发送消息,接收端接收后立即响应,发送端接受响应的消息。类似心跳数据,超时后更换自己IP。

        就是一个备份机上运行的程序,向主机发送心跳数据,如果主机挂了(接受超时),备份机更换自己IP为主机IP。

接收端:

  1. using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Net;
    using System.Net.Sockets;
    using System.Threading;
  2.  
  3. namespace HostBackupReciever
    {
    public class UdpReceiver
    {
    private UdpClient _udpClient;
    private Thread _recvThread;
  4.  
  5. public UdpReceiver()
    {
    _udpClient = new UdpClient(11000);
    }
  6.  
  7. public void StartReceive()
    {
    _recvThread = new Thread(new ThreadStart(Receive));
    _recvThread.Start();
    }
  8.  
  9. private void Receive() {
    int count = 0;
    while (true)
    {
    try
    {
    byte[] recvBytes = new byte[1024];
    IPEndPoint point = new IPEndPoint(IPAddress.Any, 0);
    recvBytes = _udpClient.Receive(ref point);
    Console.WriteLine("I'm Receiver:" + DateTime.Now.ToString() + "--->接收消息:" + Encoding.Default.GetString(recvBytes));
    if (recvBytes != null)
    {
    string sts = "北平地铁又瘫痪了";
    byte[] bs = Encoding.Default.GetBytes(sts);
    if (count == 10) {
    Thread.Sleep(11000);
    }
    _udpClient.Send(bs, bs.Length, point);
    Console.WriteLine("I'm Receiver:我已发送消息--" + sts + "第" +count + "次");
    }
    count++;
  10.  
  11. }
    catch (Exception ex) {
    Console.WriteLine(ex.Message);
    }
    }
    }
    }
    }

启动接收端:

  1. using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
  2.  
  3. namespace HostBackupReciever
    {
    class RecerverService
    {
    public static void main(string[] args) {
    Console.WriteLine("receiver start");
    UdpReceiver receiver = new UdpReceiver();
    receiver.StartReceive();
    }
    }
    }

发送端:

  1. using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Net;
    using System.Net.Sockets;
    using System.Threading;
  2.  
  3. namespace ChooseIPDemo
    {
    public class UdpChecker
    {
  4.  
  5. private UdpClient _udpClient;
    private Thread _sendThread;
    private string _sendIp;//绑定的发送ip
    private bool status = true; //标记线程状态,中止线程运行
    public event EventHandler<CheckerEventArgs> HostDisconnectedHandler;//保存地址信息
    //
    private void OnHostDisconnected(string address)
    {
    try
    {
    Console.WriteLine("开始停止线程");
    }
    catch (Exception e)
    {
    Console.WriteLine("exception" + e.Message);
    }
    if(HostDisconnectedHandler!=null)
    HostDisconnectedHandler(this, new CheckerEventArgs() { HostAddress = address });//直接给HostAddress赋值
    Console.WriteLine("已将address设置完毕");
    }
    //
    public UdpChecker(string _sendIp)
    {
    _udpClient = new UdpClient(12000);
    this._sendIp = _sendIp;
    }
    //
    public void StartCheck()
    {
    _sendThread = new Thread(new ThreadStart(Check));
    _sendThread.Start();
    }
    private void Check()
    {
    int count = 0;
    while (status) {
    try
    {
    string msg = "告诉我今天的新闻第" + count + "条";
    IPEndPoint point = new IPEndPoint(IPAddress.Parse(_sendIp), 11000);//
    byte[] msgBytes = Encoding.Default.GetBytes(msg);
    _udpClient.Send(msgBytes, msgBytes.Length, point);
    DateTime sendTime = DateTime.Now;
    DateTime recvTime = DateTime.Now;
    Console.WriteLine("I'm Sender:已经发送:" + msg);
    count++;
    byte[] recBytes = _udpClient.Receive(ref point);
    if (recBytes != null)
    {
    Console.WriteLine("I'm Sender:接受的来自receiver的消息:" + Encoding.Default.GetString(recBytes));
    recvTime = DateTime.Now;
    _sendIp = point.Address.ToString();
    }
    if ((recvTime - sendTime).TotalSeconds > 5)
    {
    Console.WriteLine("收取超时");
    status = false;
    OnHostDisconnected(_sendIp);
    }
    }
    catch (SocketException ex)
    {
    Console.WriteLine(ex.ToString());
    }
    finally
    {
    Thread.Sleep(2000);
    }
    }
    }
    }
    /**/
    public class CheckerEventArgs:EventArgs
    {
    private string hostAddress;
    public string HostAddress
    {
    get
    {
    return hostAddress;
    }
    set
    {
    hostAddress = value;
    }
    }
    }
    }

启动发送端:(需要添加一个DLL:System.Management.DLL,不添加也可以,将ChangIP方法去掉,默认注释掉了,)

  1. using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Management;
    namespace ChooseIPDemo
    {
    class HotBakupService
    {
    public static void Main() {
    UdpChecker checker = new UdpChecker("127.0.0.1");//目标主机IP,也是超时后备用机要切换的IP
    checker.StartCheck();
    checker.HostDisconnectedHandler += new EventHandler<CheckerEventArgs>(checker_HostDisconnectedHandler);//注册事件
    Console.ReadKey();
    }
    static void checker_HostDisconnectedHandler(object sender, CheckerEventArgs e)
    {
    Console.WriteLine("事件响应成功");
    Console.WriteLine(e.HostAddress);
    //ChangeIP(e.HostAddress);
    Console.ReadKey();
    }
  1. /* 
  1.     static void ChangeIP(string ipaddress)
    {
    ManagementBaseObject inPar = null;
    ManagementBaseObject outPar = null;
    ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
    ManagementObjectCollection moc = mc.GetInstances();
    foreach (ManagementObject mo in moc)
    {
    if (!(bool)mo["IPEnabled"])
    continue;
    //设置ip地址和子网掩码
    inPar = mo.GetMethodParameters("EnableStatic");
    inPar["IPAddress"] = new string[] { "192.168.1.252" };// { "192.168.1.252" ,"192.168.1.254"}1.备用 2.IP,
    inPar["SubnetMask"] = new string[] { "255.255.255.0" };
    outPar = mo.InvokeMethod("EnableStatic", inPar, null);
    //设置网关地址
    inPar = mo.GetMethodParameters("SetGateways");
    inPar["DefaultIPGateway"] = new string[] { "192.168.1.1" }; // 1.网关;2.备用网关
    outPar = mo.InvokeMethod("SetGateways", inPar, null);
    //设置DNS
    inPar = mo.GetMethodParameters("SetDNSServerSearchOrder");
    inPar["DNSServerSearchOrder"] = new string[] { "202.97.224.69", "202.97.224.68" }; // 1.DNS 2.备用DNS
    outPar = mo.InvokeMethod("SetDNSServerSearchOrder", inPar, null);
    break;
    }
    }*/
    }
  2.  
  3. }

结果图:第十次的时候设置较长间隔,接受时间超时,成功。

C#UDP同步实例的更多相关文章

  1. Swoole 中使用 UDP 异步服务器、UDP 同步客户端、UDP 协程客户端

    UDP 异步风格服务器 # udp_server.php // 创建 UDP 服务器对象,监听0.0.0.0:9502端口,类型为SWOOLE_SOCK_UDP $serv = new Swoole\ ...

  2. ASP.NET Core的配置(5):配置的同步[ 实例篇]

    ConfigurationBuilder在生成以Configuration对象的时候会利用注册其中的ConfigurationProvider加载原始的配置数据,那么一旦配置源中的数据发生变化,应用程 ...

  3. [转]VB Winsock 控件TCP与UDP连接实例

    [-] 可能的用途 选择通讯协议 协议的设置 确定计算机的名称 TCP 连接初步 接受多个连接请求 UDP 初步 关于 Bind 方法   利用 WinSock 控件可以与远程计算机建立连接,并通过用 ...

  4. linux C 多线程/线程池编程 同步实例

    在多线程.线程池编程中经常会遇到同步的问题. 1.创建线程 函数原型:int pthread_create(pthread_t *thread, const pthread_attr_t *attr, ...

  5. VC++使用socket进行TCP、UDP通信实例总结

    1.        两台计算机通信需要协议,通信的两台计算机IP必须唯一 2.        同一个计算机可以进行多个应用程序与其他计算机通信,IP地址唯一,而端口号是区别同一计算机(同一IP)的唯一 ...

  6. boost库之udp广播实例

    //UdpLinkServer.h //udp服务 #pragma once #include <boost/asio/ip/tcp.hpp> #include <boost/asi ...

  7. linux线程同步实例

    [Linux多线程]三个经典同步问题 - 神奕的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/lisonglisonglisong/article/details ...

  8. python多线程同步实例分析

    进程之间通信与线程同步是一个历久弥新的话题,对编程稍有了解应该都知道,但是细说又说不清.一方面除了工作中可能用的比较少,另一方面就是这些概念牵涉到的东西比较多,而且相对较深.网络编程,服务端编程,并发 ...

  9. C++与C# UDP通信实例(同一台PC)

    对于同一个PC机而言,服务器端和客户端在一个PC机上面,端口必须要不一样,不然会冲突. 你总不能自己又当爹又当妈吧. 所以在进行程序设计的时候,需要考虑这一点: 在此接口设计中,C++当作UDP的服务 ...

随机推荐

  1. 单点登录系统构建之二——SSO原理及CAS架构

    基本概念 SSO(Single Sign On)单点登录,是在多个应用系统中,用户只需要登录一次就能访问所有相互信任的应用系统.它包括将这次的主要登录映射到其他应用中用户同一个用户的登录机制. SSO ...

  2. 嵌入式linux内核是什么?

    linux内核是一种可以被内核动态加载(insmode)和卸载(rmmod)的可执行二进制代码 最简单的内核 #include <linux/module.h> #include < ...

  3. Spring 实践 -AOP

    Spring 实践 标签: Java与设计模式 AOP引介 AOP(Aspect Oriented Programing)面向切面编程采用横向抽取机制,以取代传统的纵向继承体系的重复性代码(如性能监控 ...

  4. UVa 1626 (输出方案) Brackets sequence

    正规括号序列定义为: 空序列是正规括号序列 如果S是正规括号序列,那么[S]和(S)也是正规括号序列 如果A和B都是正规括号序列,则AB也是正规括号序列 输入一个括号序列,添加尽量少的括号使之成为正规 ...

  5. Eclipse 打开编辑文件所在文件夹方法

    一个便捷的方法在eclipse的菜单中,依次点击Run->External Tools-> External Tools configurations添加一个新的工具 OpenContai ...

  6. 【转】Github轻松上手3-使用Tower图形化界面工具创建和管理repo

    转自:http://blog.sina.com.cn/s/blog_4b55f6860100zzib.html 除了在命令行中输入特定的命令,另外一种方式就是用第三方的可视化工具,比如Mac下的Tow ...

  7. Hadoop1.1.2伪分布式安装笔记

    一.设置Linux的静态IP 修改桌面图标修改,或者修改配置文件修改 1.先执行ifconfig,得到网络设备的名称eth0 2.编辑/etc/sysconfig/network-scripts/if ...

  8. 页面异步加载javascript文件

    昨天听一同事说的异步加载js文件,可以提高页面加载速度.具体方法如下:(function() {  var ga = document.createElement('script'); ga.type ...

  9. pthread_attr_t 线程属性(二)

    一.函数: 1.线程属性的初始化与销毁:#include <pthread.h>int pthread_attr_init(pthread_attr_t *attr);int pthrea ...

  10. Bootstrap学习之路(3)---列表组件

    列表是几乎所有网站都会用到的一个组件,正好bootstrap也给我们提供了这个组件的样式,下面我给大家简单介绍一下bootstrap中的列表组件的用法! 首先,重提一下引用bootstrap的核心文件 ...