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

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

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

说一下代码背景:实现的功能是发送端发送消息,接收端接收后立即响应,发送端接受响应的消息。类似心跳数据,超时后更换自己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. CSS_简介/语法结构/长度单位/应用方式/标签的样式重置/表单样式重置

    一.CSS简介:  w3c(World Wide Web Consortium):万维网联盟,是规定网页标准的一个组织(叫做Web标准) Web标准:是由w3c和其他标准化组织制定的一系列标准的集合, ...

  2. hdu4604 deque

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4604 思路:就是模拟一下,求每一个开始的非上升和非下降序列.然后求重复的数,由于求出来可能不会是我们想 ...

  3. Codeforces 377 A Maze【DFS】

    题意:给出n*m的矩阵,矩阵由'.'和'#'组成,再给出k,表示需要在'.'处加k堵墙,使得剩下的'.'仍然是连通的 先统计出这个矩阵里面总的点数'.'为sum 因为题目说了一定会有一个解,所以找到一 ...

  4. ecshop init.php文件分析(转)

    <?php /** * ECSHOP 前台公用文件 */ //防止非法调用 defined-判断常量是否已定义,如果没返回false if (!defined('IN_ECS')) { die( ...

  5. *ecshop 限制文章帮助文章显示条数

    1.打开 /themes/default/library/help.lbi 文件 <!-- {foreach from=$help_cat.article item=item} --> & ...

  6. Oracle 中的 TO_DATE 和 TO_CHAR 函数

    Oracle 中的 TO_DATE 和 TO_CHAR 函数oracle 中 TO_DATE 函数的时间格式,以 2008-09-10 23:45:56 为例 格式 说明 显示值 备注 Year(年) ...

  7. 不要随随便便的distinct和order by

    相关查询非常慢,通过程序拿到了相关sqlexplainexplain SELECT DISTINCT(o.orders_id), o.oa_order_id, customers_email_addr ...

  8. jQuery 实现Bootstrap Chart 图表

    很多时候我们制作报表的时候需要图表,如果你使用bootstrap开发你的网站,如果你需要使用图表,那么最简单的方法就是就是使用bootstrap 的chart.js来实现图表,下面介绍方法 1.引入c ...

  9. 【PHP入门到精通】:Ch03:PHP语言基础

    1, PHP风格 这里为了显示代码把"<"和">"和key值以空格分开了,实际书写时切记不要将其分开: (1) < ?php ? >: ...

  10. 14、NFC技术:使用Android Beam技术传输文本

    Android Beam的基本理念 Android Beam的基本理念就是两部(只能是两部)NFC设备靠近时(一般是背靠背),通过触摸一部NFC设备的屏幕,将数据推向另外一部NFC设备.在传递数据的过 ...