using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Collections; namespace moniopter
{
public static class UDPManager
{
//本机名称和IP
public static string ComputerName;
public static string ComputerIP; public const int listenProt = 10318;//设置端口号
static UdpClient listener = null;//提供的网络服务
static Thread listenter = null;//创建一个监听消息的进程
static bool islistenter;//是否要监听
public static bool IsMsgReader;//消息是否已读
static UDPManager()
{
IsMsgReader = true;
ComputerName = Dns.GetHostName();
ComputerIP = GetIPAddress();
islistenter = true; //加下面这句是为了在开启线程中可以访问控件属性
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
listenter = new Thread(StartListener);
listenter.Start();
} //关闭
public static void Close()
{
if (listener == null)
{
return;
}
try
{
listener.Close();//关闭探听消息服务
listenter.Abort();//关闭监听消息进程
}
catch{ }
} //获取IP
private static string GetIPAddress()
{
string AddressIP = "";
//第一种办法获取
foreach (IPAddress _IPAddress in Dns.GetHostEntry(Dns.GetHostName()).AddressList)
{
if (_IPAddress.AddressFamily.ToString().ToLower() == "internetwork")
{
return _IPAddress.ToString();
}
}
//第二种办法获取
if (AddressIP == "")
{
IPHostEntry myEntry = Dns.GetHostEntry(System.Net.Dns.GetHostName());
if (myEntry.AddressList.Length > 1)
{
if (myEntry.AddressList[0].ToString().IndexOf('.') > 0)
{
AddressIP = myEntry.AddressList[0].ToString();
}
else
{
AddressIP = myEntry.AddressList[1].ToString();
}
AddressIP = myEntry.AddressList[1].ToString();
}
else
{
AddressIP = myEntry.AddressList[0].ToString();
}
}
return AddressIP;
} public delegate void Listenter(string UIP, string msg); public static event Listenter OnListenter; //开始监听
private static void StartListener()
{
listener = new UdpClient(listenProt); //使用UDP协议
IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, listenProt); //任意IP,
try
{
while (islistenter)//处于监听状态
{
byte[] bytes = listener.Receive(ref groupEP);
string Uip = groupEP.Address.ToString();//发信人的IP
string strInfo = Encoding.GetEncoding("gb2312").GetString(bytes, 0,
bytes.Length);//获得信息
string[] msg = { Uip, strInfo };//放入ip,和内容
OnListenter(Uip, strInfo);
}
}
catch { }
finally
{
listener.Close();
}
} /// <summary>
/// 发送消息 string
/// </summary>
/// <param name="msg"></param>
/// <param name="ipStr"></param>
public static void Send(string msg, string ipStr)
{
Socket s = new Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp);
try
{
IPAddress broadcast = IPAddress.Parse(ipStr);
byte[] sendbuf = Encoding.GetEncoding("gb2312").GetBytes(msg);
IPEndPoint ep = new IPEndPoint(broadcast, listenProt); //65507 可发送最大byte 64512
if (sendbuf.Length <= 64512)
{
s.SendTo(sendbuf, ep);
}
}
catch { }
finally
{
s.Close();
}
} }
}

  

简单 UDP 操作类的更多相关文章

  1. [C#]exchange发送,收件箱操作类

    最近项目中需要用到exchange的操作,就参照msdn弄了一个简单的操作类.目前先实现了,发送邮件和拉取收件箱的功能,其他的以后在慢慢的添加. using Microsoft.Exchange.We ...

  2. 使用jxl操作之一: 实现对Excel简单读写操作

    项目目录树 对象类UserObject UserObject.java package com.dlab.jxl; public class UserObject { private String u ...

  3. 【知识必备】ezSQL,最好用的数据库操作类,让php操作sql更简单~

    最近用php做了点小东东,用上了ezSQL,感觉真的很ez,所以拿来跟大家分享一下~ ezSQL是一个非常好用的PHP数据库操作类.著名的开源博客WordPress的数据库操作就使用了ezSQL的My ...

  4. 一个简单的ORM制作(CURD操作类)

    SQL执行类 CURD操作类 其他酱油类 此篇是为上篇文章填坑的,不知道上篇砸过来的砖头够不够,不够的话请大家继续砸. CURD操作类负责将用户提供的条件转换为SQL语句,并提供给IHelper执行, ...

  5. 简单的php数据库操作类代码(增,删,改,查)

    这几天准备重新学习,梳理一下知识体系,同时按照功能模块划分做一些东西.所以.mysql的操作成为第一个要点.我写了一个简单的mysql操作类,实现数据的简单的增删改查功能. 数据库操纵基本流程为: 1 ...

  6. 3.NetDh框架之缓存操作类和二次开发模式简单设计(附源码和示例代码)

    前言 NetDh框架适用于C/S.B/S的服务端框架,可用于项目开发和学习.目前包含以下四个模块 1.数据库操作层封装Dapper,支持多种数据库类型.多库实例,简单强大: 此部分具体说明可参考博客: ...

  7. 2.NetDh框架之简单高效的日志操作类(附源码和示例代码)

    前言 NetDh框架适用于C/S.B/S的服务端框架,可用于项目开发和学习.目前包含以下四个模块 1.数据库操作层封装Dapper,支持多种数据库类型.多库实例,简单强大: 此部分具体说明可参考博客: ...

  8. 简单的XML操作类

    /// <summary> /// XmlHelper 的摘要说明. /// xml操作类 /// </summary> public class XmlHelper { pr ...

  9. Java 数据库简单操作类

    数据库操作类,将所有连接数据库的配置信息以及基本的CRUD操作封装在一个类里,方便项目里使用,将连接数据库的基本信息放在配置文件 "dbinfo.properties" 中,通过类 ...

随机推荐

  1. Leetcode题目31.下一个排列(中等)

    题目描述: 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外 ...

  2. github搜索不到代码的问题

    Hi team, Please check the following three query url :https://github.com/Konctantin/GreyMagic/search? ...

  3. Python将函数放入模块

    函数可以将通用的代码封装起来,便于其他程序或者方法调用.将函数存放在文件中,这个文件被称为模块.将函数存储在独立的模块中,可与其他程序员共享这些文件而不是整个程序. fun.py def say_hi ...

  4. Android jni/ndk编程二:jni数据类型转换(primitive,String,array)

    一.数据类型映射概述 从我们开始jni编程起,就不可能避开函数的参数与返回值的问题.java语言的数据类型和c/c++有很多不同的地方,所以我们必须考虑当在java层调用c/c++函数时,怎么正确的把 ...

  5. 十、封装assertResponse响应断言

    一.assertNotNull介绍 assertNotNull(responseEntity.getBody());可判断报文是否为空 responseEntity为响应实体对象 二.assertEq ...

  6. YJango的卷积神经网络——介绍

    原文地址:https://zhuanlan.zhihu.com/p/27642620 如果要提出一个新的神经网络结构,首先就需要引入像循环神经网络中“时间共享”这样的先验知识,降低学习所需要的训练数据 ...

  7. 手机APP流量的发送与获取功能的实现

    package com.loaderman.trafficdemo; import android.content.Context; import android.content.Intent; im ...

  8. [spring]AOP(切面)编程

    AOP 即 Aspect Oriented Program 面向切面编程 首先,在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能. 所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务 ...

  9. 数据中心网络架构的问题与演进 — Overlay 网络

    目录 文章目录 目录 前文列表 数据中心网络架构演进回顾 Overlay 网络 Overlay 网络的优势 基于 VxLAN Overlay 的 Spine-Leaf 网络架构 参考文章 前文列表 & ...

  10. redis(3)主从与集群

    一.主从架构 yum安装的redis cd /etc/ cp redis.conf /etc/slave.conf vim slave.conf bind 192.168.42.7 slaveof p ...