C# 异步UDP发送接收数据
【C# 异步UDP发送接收数据】UDP:User Datagram Protocol 用户数据报协议,是一个无连接的传输协议。
所以不像TCP一样要使用ConnectAsync来与服务器连接,直接向服务器发送数据即可。
参考:MSDN
public bool ReceiveFromAsync (System.Net.Sockets.SocketAsyncEventArgs e);
Returns
Boolean
true if the I/O operation is pending. The Completed event on the e parameter will be raised upon completion of the operation.false if the I/O operation completed synchronously. In this case, The Completed event on the e parameter will not be raised and the e object passed as a parameter may be examined immediately after the method call returns to retrieve the result of the operation.
简单来说就是如果返回值是true就等待处理,接收成功了会触发回调事件
如果是false就说明已经同步处理完成了,这时回调事件不会触发,需要自己手动执行。
SendToAsync也是一个道理
也就有了下面的代码:
...省略定义一些成员变量:connectSocket,endPoint 等
...省略(构造函数,传入ip和port)...
connectSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPAddress address;
if (!IPAddress.TryParse(ip, out address)) // 尝试解析IP,万一它是一个域名呢
{
try
{
IPHostEntry host = Dns.GetHostEntry(ip);
address = host.AddressList[0];
}
catch (Exception)
{
Console.WriteLine("IP解析错误!");
}
}
endPoint = new IPEndPoint(address, port);
......省略(定义一个“发消息”方法,传入byte[] buff)...
SocketAsyncEventArgs saea = new SocketAsyncEventArgs();
saea.SetBuffer(buff, 0, buff.Length);
saea.UserToken = connectSocket;
saea.Completed += new EventHandler(IO_Completed);
saea.RemoteEndPoint = endPoint;
if (!connectSocket.SendToAsync(saea))
{
IO_Completed(null, saea);
}
...private void IO_Completed(object sender, SocketAsyncEventArgs e)
{
switch (e.LastOperation)
{
case SocketAsyncOperation.ReceiveFrom:
ProcessReceive(e);
break;
case SocketAsyncOperation.SendTo:
ProcessSend(e);
break;
default:
Console.WriteLine(e.LastOperation);
break;
}
}
///
/// 处理udp客户端发送的结果
///
///
private void ProcessSend(SocketAsyncEventArgs e)
{
if (e.SocketError == SocketError.Success)
{
// 发送成功就可以准备接收
byte[] buff = new buff[1024]
SocketAsyncEventArgs saea = new SocketAsyncEventArgs();
saea.SetBuffer(buff, 0, buff.Length);
saea.UserToken = connectSocket;
saea.Completed += new EventHandler(IO_Completed);
saea.RemoteEndPoint = endPoint;
if (!connectSocket.ReceiveFromAsync(saea))
IO_Completed(null, saea);
}
else
{
// 发送失败
}
}
///
/// 处理接受到的udp服务器数据
///
///
private void ProcessReceive(SocketAsyncEventArgs e)
{
if (e.BytesTransferred > 0 && e.SocketError == SocketError.Success)
{
//处理接收到的数据(e.Buffer);
}
else
{
//没有接收到数据
}
}
推荐阅读
- python学习之|python学习之 实现QQ自动发送消息
- spring|spring boot中设置异步请求默认使用的线程池
- Promise详解
- Promise|Promise 异步控制流
- Vue组件开发之异步组件详解
- 关于ajax异步分页传输数据到页面为字符串的JS解决办法
- 异步回调函数传值问题
- 并发,并行,阻塞,非阻塞,异步,同步
- QT5实现UDP通信的示例代码
- C#|C# 多线程初级汇总