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.网络编程概述: 通过通信线路(有线或无线)可以把不同地理位置且相互独立的计算机连同其外部设备连接起来,组成计算机网络.在操作系统.网络管理软件及网络 通信协议的管理和协调下,可以 ...
随机推荐
- C#List的创建例程
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- iOS 界面布局
1. auto layout http://www.devtalking.com/articles/adaptive-layout-for-iphone6-1/ http://blog.sina.co ...
- NOIP2015BLOCKADE c++ 代码
#include<algorithm> #include<fstream> #include<functional> #include<iostream> ...
- Git 教程 -- 基于自己学习记录
Git 教程 -- 基于自己学习记录 1. 引言 由于学校布置了一项熟悉 git 和 svn 操作的实验,所以自己重新温习了下 git,记录过程在这. 2. 注册登录 GitHub. 3. 选择一个仓 ...
- python3字典:获取json响应值来进行断言的用法详解
在Python中我们做接口经常用到一些json的返回值我们常把他转化为字典,在前面的python数据类型详解(全面)中已经谈到对字典的的一些操作,今天我们就获取json返回值之后,然后转化为字典后的获 ...
- URL的组成和含义
1.URL - Uniform Resource Locator 当您点击 HTML 页面中的某个链接时,对应的 <a>标签指向万维网上的一个地址. 统一资源定位器(URL)用于定位万维网 ...
- jQuery 获取元素当前位置offset()与position()
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...
- ltp-ddt eth过程中遇到的问题
eth_iperf_tcp ETH_S_PERF_IPERF_TCP_INTPACING_8K_1448B source 'common.sh'; iface=`get_eth_iface_name. ...
- [转] CentOS7 用 kubeadm 快速安装 Kubernetes v1.13.4 最新教程
[转 + 编辑][From] https://www.jianshu.com/p/4d61f18bc62d , https://www.jianshu.com/p/5ff6e26d1912 时间是2 ...
- Mac 10.12搭建OpenVPN服务器以及客户端的使用
说明:我未实践,大概就是这几个步骤,建议服务器在Linux下搭建效果会更好. 1.用brew下载openvpn brew install openvpn 2.命令行输入 openvpn --versi ...