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

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

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

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

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

接收端:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading; namespace HostBackupReciever
{
public class UdpReceiver
{
private UdpClient _udpClient;
private Thread _recvThread; public UdpReceiver()
{
_udpClient = new UdpClient(11000);
} public void StartReceive()
{
_recvThread = new Thread(new ThreadStart(Receive));
_recvThread.Start();
} 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++; }
catch (Exception ex) {
Console.WriteLine(ex.Message);
}
}
}
}
}

启动接收端:

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

发送端:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading; namespace ChooseIPDemo
{
public class UdpChecker
{ 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方法去掉,默认注释掉了,)

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();
}
       /* 
    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;
}
}*/
} }

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

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. HTML5中的localStorage用法

    存储数据的方法就是直接给window.localStorage添加一个属性,例如:window.localStorage.name 或者 window.localStorage["name& ...

  2. 瞎折腾之 Lucene.Net + MVC 搜索功能(上)

    前言 首先,关于Lucene.Net 的文章已经很多了.我这次决定写出来只是为了练练手,虽然在别人看来没什么用,但是自己确实是手动实践了一把.我个人觉得还是有意义的.爱折腾.敢于实践.才能有所收获,才 ...

  3. java MVC设计模式

    MVC(Model View Control)模型-视图-控制器 一.MVC与模板概念的理解 MVC本来是存在于Desktop程序中的,M是指数据模型,V是指用户界面,C则是控制器.使用MVC的目的是 ...

  4. 今天发现猎豹浏览器的一个大坑 Request.IsAuthenticated 一直为 false;另外附加原因以及临时的解决方法

    今天掉到了一个大坑里面,爬了1个多小时才发现不是代码的问题,居然是浏览器的问题… 下面是问题的发生过程 单点登陆  有2个站点  http://a.abc.com  http://b.abc.com ...

  5. HDU 1018 Big Number (阶乘位数)

    题意: 给一个数n,返回该数的阶乘结果是一个多少位(十进制位)的整数. 思路: 用对数log来实现. 举个例子 一个三位数n 满足102 <= n < 103: 那么它的位数w 满足 w ...

  6. php多种实例理解无限极分类

  7. python练习程序(显示图像)

    import matplotlib as mpl import Image import numpy as np import matplotlib.pyplot as plt im=Image.op ...

  8. 每天一个Linux命令(3): cd

    Linux cd 命令可以说是Linux中最基本的命令语句,其他的命令语句要进行操作,都是建立在使用 cd 命令上的. 所以,学习Linux 常用命令,首先就要学好 cd 命令的使用方法技巧. 1.  ...

  9. PS常用

    一.文字和背景居中 1.按Ctrl+A或用矩形框选中所有 2.按选择工具->在工具属性栏里面会显示6种方向的对齐方式 二.画准确铺助线 1.视图->新建参考线->输入数值既可

  10. 【英语】Bingo口语笔记(11) - 表示“身体抱恙”