C# SocketUdpServer
public interface ISocketUdpServer
{
void Start();
void Stop();
int SendData(byte[] data, IPEndPoint remoteEndPoint); event ReceiveDataHandler ReceivedDataEvent;
event ErrorHandler ErrorEvent;
} public delegate void ReceiveDataHandler(SocketState state); public delegate void OnlineChangeHandler(int onlines, EndPoint client); public delegate void ErrorHandler(string error, EndPoint client); public class SocketUdpServer : ISocketUdpServer
{
private readonly Socket _udpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
private bool _isListening; public SocketUdpServer(IPEndPoint localPoint)
{
_udpSocket.ReceiveBufferSize = * ;
_udpSocket.Bind(localPoint);
} public Socket GetUdpSocket()
{
return _udpSocket;
} public void Start()
{
_isListening = true;
BeginReceive();
} public void Stop()
{
_isListening = false;
} public int SendData(byte[] data, IPEndPoint remoteEndPoint)
{
return _udpSocket.SendTo(data, remoteEndPoint);
} public event ReceiveDataHandler ReceivedDataEvent; public event ErrorHandler ErrorEvent; private void BeginReceive()
{
if (_isListening)
{
SocketState state = new SocketState { Self = _udpSocket };
_udpSocket.BeginReceiveFrom(state.Buffer, , state.Buffer.Length, SocketFlags.None,
ref state.RemotePoint, ReceiveCallback, state);
}
} private void ReceiveCallback(IAsyncResult ar)
{
var state = ar.AsyncState as SocketState;
try
{
if (state != null)
{
int receiveLen = state.Self.EndReceiveFrom(ar, ref state.RemotePoint);
if (receiveLen > )
{
byte[] receivedData = new byte[receiveLen];
Array.Copy(state.Buffer, , receivedData, , receiveLen);
state.Buffer = receivedData;
state.ReceivedTime = DateTime.Now;
ReceivedDataEvent?.Invoke(state);
}
}
}
catch (Exception error)
{
ErrorEvent?.Invoke(error.Message, state?.RemotePoint);
}
finally
{
if (state != null) BeginReceive();
}
} } public class SocketState
{
public byte[] Buffer = new byte[ * ];
public Socket Self;
public EndPoint RemotePoint = new IPEndPoint(IPAddress.Any, );
public DateTime ReceivedTime { get; set; }
}
C# SocketUdpServer的更多相关文章
- 用c#写的一个局域网聊天客户端 类似小飞鸽
用c#写的一个局域网聊天客户端 类似小飞鸽 摘自: http://www.cnblogs.com/yyl8781697/archive/2012/12/07/csharp-socket-udp.htm ...
- Unity Socket UDP
using System.Collections; using System.Collections.Generic; using System.Net.Sockets; using System.N ...
- 8.9.网络编程_Socket 远程调用机制
1.网络编程 1.1.网络编程概述: 通过通信线路(有线或无线)可以把不同地理位置且相互独立的计算机连同其外部设备连接起来,组成计算机网络.在操作系统.网络管理软件及网络 通信协议的管理和协调下,可以 ...
随机推荐
- deepin获取root权限
ctrk+alt+t 打开终端 输入 sudo passwd root mywork@mywork-PC:~$ sudo passwd root[sudo] mywork 的密码: [sudo] 输入 ...
- linux命令之用户管理及用户信息查询命令(上)
1.useradd:创建用户 该命令用于创建新的用户或者更改用户的信息. 参数 说明 -g 指定用户对应的用户组,用户组 -s 用户登录后使用的Shell名称 -u 用户的ID值 示例: 1)user ...
- Java50道经典习题-程序18 乒乓球赛
题目:两个乒乓球队进行比赛,各出三人.甲队为a,b,c三人,乙队为x,y,z三人.已抽签决定比赛名单.有人向队员打听比赛的名单. a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单.分析: ...
- wireshark 1.10.0 编译 及 协议解析部分的一些变化
wireshark不久前升级到1.10.0稳定版,这个版本正如其版本号一样,相比1.8.x有较大变化. 我们先说说在windows下编译的问题,1.8.4/1.8.6版本的编译见我的文章:http:/ ...
- jmeter服务器监控插件下载配置
jmeter想要监控服务器CPU.内存.磁盘.网络等相关资源需要借助plugins插件 下载jmeter性能监控插件 1.下载jmeterPlugins-Standard和jmeterPlugins- ...
- 考试题 T2
题意分析 首先 要求起点终点不连通 再结合数据范围 就是最小割了 首先我们可以建一个图出来 如果\(x\)可以到\(y\)的话 那么我们就从\(x\)向\(y\)连一条代价为\(h[x]-h[y]+1 ...
- leetcode-40-组合总和 II
题目描述: 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在每个组合中只 ...
- Java多线程——线程封闭
线程封闭:当访问共享的可变数据时,通常需要同步.一种避免同步的方式就是不共享数据.如果仅在单线程内访问数据,就不需要同步,这种技术称为线程封闭(thread confinement) 线程封闭技术一 ...
- Markdown基本语法总结
一.标题 在想要设置为标题的文字前面加#来表示 一个#是一级标题,二个#是二级标题,以此类推.支持六级标题. 注:标准语法一般在#后跟个空格再写文字. 示例: # 这是一级标题 ## 这是二级标题 # ...
- Codeforces Round #517
传送门 A. Cram Time 你有一本书,阅读第\(i\)页需要花费\(i\)的时间.你第一天有\(a\)的时间,第二天有\(b\)的时间,问你的总阅读页数的最大值. Input: 一行包含\(2 ...