2024-10-17 01:59:25 +08:00
|
|
|
|
using System;
|
2024-08-17 14:27:18 +08:00
|
|
|
|
using System.Net.Sockets;
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
2024-10-17 01:59:25 +08:00
|
|
|
|
namespace JNGame.Runtime.Util
|
2024-08-17 14:27:18 +08:00
|
|
|
|
{
|
|
|
|
|
public class NetTool
|
|
|
|
|
{
|
|
|
|
|
public static async Task SendAsync(Socket socket, byte[] buffer)
|
|
|
|
|
{
|
|
|
|
|
// 注意:这里我们实际上并没有直接使用async/await,因为BeginSend是回调模式
|
|
|
|
|
// 但我们可以使用TaskCompletionSource来桥接回调和async/await
|
|
|
|
|
var tcs = new TaskCompletionSource<int>();
|
|
|
|
|
|
|
|
|
|
// 异步发送数据
|
|
|
|
|
socket.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, (ar) =>
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
int bytesSent = socket.EndSend(ar);
|
|
|
|
|
tcs.SetResult(bytesSent);
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
tcs.SetException(ex);
|
|
|
|
|
}
|
|
|
|
|
}, null);
|
|
|
|
|
|
|
|
|
|
// 等待发送完成
|
|
|
|
|
await tcs.Task;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|