UDP通信是一种高效率的通信协议,虽然会出现丢包现象,但我们可以通过更上层的协议或者其他方法来实现重发,所以,被广泛的用户Socket的通信中。下面介绍下C#中,UDP的实现。
/// <summary>
/// 远程端点(IP和端口)
/// </summary>
private IPEndPoint mIPEndPoint;
/// <summary>
/// socket
/// </summary>
private Socket mSocket;
/// <summary>
/// 运行标记
/// </summary>
private bool mUDPRunningFlag = false;
/// <summary>
/// 接收线程
/// </summary>
private Thread mUDPReceiveThread;
/// <summary>
/// 监听端口号
/// </summary>
private int mUDPMonitorPort = 9527;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="port">监听端口</param>
public UDPHandler(int port)
{
mDictionary = new Dictionary<string, string>();
mUDPMonitorPort = port;
mIPEndPoint = new IPEndPoint(IPAddress.Any, this.mUDPMonitorPort);
mSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
long IOC_IN = 0x80000000;
long IOC_VENDOR = 0x18000000;
long SIO_UDP_CONNRESET = IOC_IN | IOC_VENDOR | 12;
byte[] optionInValue = { Convert.ToByte(false) };
byte[] optionOutValue = new byte[4];
mSocket.IOControl((int)SIO_UDP_CONNRESET, optionInValue, optionOutValue);
}
/// <summary>
/// 启动监听线程
/// </summary>
public void StartUDPMonitor()
{
if (mUDPReceiveThread != null)
{
Thread.Sleep(30);
mUDPReceiveThread.Abort();
}
mUDPRunningFlag = true;
mSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
//绑定网络地址
mSocket.Bind(mIPEndPoint);
//启动监听线程
mUDPReceiveThread = new Thread(new ThreadStart(ReceiveData));
mUDPReceiveThread.ApartmentState = ApartmentState.STA;
mUDPReceiveThread.IsBackground = true;
mUDPReceiveThread.Start();
}
/// <summary>
/// 接收数据
/// </summary>
private void ReceiveData()
{
EndPoint mRemoteEndPoint = new IPEndPoint(IPAddress.Any, mUDPMonitorPort);
int dataLength = 0;
while (mUDPRunningFlag)
{
//在有数据到达时接收
if (mSocket.Poll(-1, SelectMode.SelectRead))
{
byte[] receiveData = null;
try
{
byte[] data = new byte[mSocket.Available];
dataLength = mSocket.ReceiveFrom(data, data.Length, SocketFlags.None, ref mRemoteEndPoint);
//数据到达
receiveData = data;
//数据处理
DataHandler(data, mRemoteEndPoint);
data = null;
}
catch (Exception ex)
{
string ss = ex.ToString();
throw ex;
}
}
}
}
/// <summary>
/// 处理过程
/// </summary>
/// <param name="recByte"></param>
/// <param name="mEndPoint"></param>
private void DataHandler(byte[] recByte, EndPoint mEndPoint)
{
int head = recByte[0];
int cmd = recByte[1];
byte deviceType = recByte[2];
//判断头是否符合
if (head == ComminicationType.DEF_PROTOCOL_STORAGE_HEAD)
{
CommunicateRecProtoclData mCommunicateRecProtoclData = new CommunicateRecProtoclData();
mCommunicateRecProtoclData.head = head;
mCommunicateRecProtoclData.cmd = cmd;
mCommunicateRecProtoclData.remoteEndPoint = mEndPoint;
mCommunicateRecProtoclData.mComminicationType = deviceType;
CommunicateRecDataEventArgs mCommunicateRecDataEventArgs = new CommunicateRecDataEventArgs(mCommunicateRecProtoclData);
switch (cmd)
{
}
}
}
/// <summary>
/// 发送消息(到指定地址)
/// </summary>
public bool SendUDPMsg(byte[] data, EndPoint remotePoint)
{
bool flag = false;
while (true)
{
if (mSocket.Poll(-1, SelectMode.SelectWrite))
{
try
{
int sendUDPDataLength = mSocket.SendTo(data, data.Length, SocketFlags.None, remotePoint);
if (sendUDPDataLength >= data.Length)
{
flag = true;
}
else
{
flag = false;
}
break;
}
catch (Exception ex)
{
flag = false;
throw ex;
}
}
else if (mSocket.Poll(-1, SelectMode.SelectError))
{
flag = false;
break;
}
else
{
continue;
}
}
return flag;
}上面就是实现UDP通信的一个简单的代码。
彭亚欧个人博客原创文章,转载请注明出处
文章关键词:C#UDP通信,C#UDP监听,C#UDP发送和接收数据
文章固定链接:https://www.pengyaou.com/homeart/Njk=.html
上一篇 Flex 移动端文件读写
下一篇 Hyy个人博客