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

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

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

说一下代码背景:实现的功能是发送端发送消息,接收端接收后立即响应,发送端接受响应的消息。类似心跳数据,超时后更换自己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. 1141. RSA Attack(RSA)

    1141 越来越喜欢数论了 很有意思 先看个RSA的介绍 RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密. RSA的算法涉及三个参数,n ...

  2. 随便谈谈alphago与人机大战

    3月16日历时8天的人机大战终于落下帷幕,alphago以4:1的比分击败了当年如日中天的李世石.这个结果让我这个围棋爱好者+计算机爱好者百感交集…… ——一个时代落幕了,一个新的时代开启了. 这次人 ...

  3. UVa 11019 (AC自动机 二维模式串匹配) Matrix Matcher

    就向书上说得那样,如果模式串P的第i行出现在文本串T的第r行第c列,则cnt[r-i][c]++; 还有个很棘手的问题就是模式串中可能会有相同的串,所以用repr[i]来记录第i个模式串P[i]第一次 ...

  4. 51nod1364 最大字典序排列

    不断的在cur的后面找最大的符合条件的数扔到cur的前面. 用线段树维护操作就可以了. #include<cstdio> #include<cstring> #include& ...

  5. BZOJ 1827 奶牛大集会

    树型DP. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm& ...

  6. Android 高仿豌豆荚 一键安装app 功能 实现

    以往我们那些应用市场 帮我们安装app的时候  我们都得点确定,当然你如果 root 以后 不用点确定 也能自动安装了,后来豌豆荚 推出了一个功能 非root的手机也能不点确定 直接帮你安装好.(如果 ...

  7. 锋利的jQuery读书笔记---jQuery中Ajax--序列化元素、Ajax全局事件

    serialize()方法: 作用于一个jQuery对象,它能够将DOM元素内容序列化为字符串,用于Ajax请求. <!DOCTYPE html> <html> <hea ...

  8. JAVA遍历一个文件夹中的所有文件

    在实际项目中给定一文件夹,得到这个文件夹下所有的文件这样的需求并不是很多,更多的是查找或是删除某一具体的文件 import java.io.File; import java.util.ArrayLi ...

  9. Oracle V$SESSION详解

    V$SESSION是APPS用户下面对于SYS.V_$SESSION 视图的同义词. 在本视图中,每一个连接到数据库实例中的session都拥有一条记录.包括用户session及后台进程如DBWR,L ...

  10. ORA-12516: TNS: 监听程序无法找到匹配协议栈的可用句柄解决方法

    1.查看当前连接进程数SQL>select count(*) from v$process;2.查看连接数上限SQL>select value from v$parameter where ...