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

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

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

说一下代码背景:实现的功能是发送端发送消息,接收端接收后立即响应,发送端接受响应的消息。类似心跳数据,超时后更换自己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. 深入.NET平台和C#编程 错题录

    1.在C#中,关于文件操作相关的类说法正确的是(AB) <选择二项> A:FileInfo类提供了用于操作文件的实例方法 B:File类提供了用于操作文件的静态方法 C:Directory ...

  2. 自己实现字符串操作函数strlen(),strcat(),strcpy(),strcmp()

    1.strlen()函数是求解字符串的有效长度的 1)非递归实现 size_t my_strlen(const char *str) { assert(str != NULL);  //断言,保证指针 ...

  3. Linux服务器偶尔无法访问问题

    最近上了一台web服务器(本地包含mysql服务器),在运行一段时间发现服务器偶尔会无法访问, 包括mysql,ftp以及ssh等都无法响应,但是已经连接上的ssh不受任何影响,在查看系统log时, ...

  4. yii2.0 事务

    $transaction=\Yii::$app->db->beginTransaction(); $model=Customer::findOne(1); $model->name= ...

  5. <十二>面向对象分析之UML核心元素之节点和设备

    节点,设备

  6. 【转】eclipse怎么设置字体大小

    原文网址:http://jingyan.baidu.com/article/f96699bb9442f3894e3c1b15.html 1. 打开eclipse,找到window 2.  点击后在下拉 ...

  7. Android 动画 6问6答

    1.view 动画有哪些需要注意的? 答:view动画 本身比较简单.http://www.cnblogs.com/punkisnotdead/p/5179115.html 看这篇文章的第五问就可以了 ...

  8. 基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境:2.搭建环境-2.1创建虚拟机

    2.1.创建虚拟机 2.1.1. 创建虚拟机节点1 2.1.2.  创建虚拟机节点2 操作如节点1. 基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境所有链 ...

  9. 深入浅出ghostbuster剖析NodeJS与PhantomJS的通讯机制

    深入浅出ghostbuster剖析NodeJS与PhantomJS的通讯机制 蔡建良 2013-11-14 一. 让我们开始吧 通过命令行来执行 1) 进行命令窗口: cmd 2) 进入resourc ...

  10. window 与ubuntu共享文件 hgfs下为空和不用每次挂载hgfs的方法

    解决hgfs为空的方法: sudo apt-get install open-vm-dkms sudo mount -t vmhgfs .host:/ /mnt/hgfs 解决每次都要挂载的方法: 1 ...