[英]C# Async UDP Server - How to Pass Socket to Callback
我正在嘗試編寫一個異步 udp 服務器,但我很難理解某些東西是如何工作的。 在這段代碼中,程序在 ClientConnected() 方法上停止,說 asyncResult.asyncstate 作為套接字為空,那么我如何將發送方的套接字傳遞給回調?
class UDPServer
{
byte[] byteData;
int bufferSize;
public ManualResetEvent allDone = new ManualResetEvent(false);
Socket serverSocket;
IPEndPoint localIPEP;
EndPoint sender = new IPEndPoint(IPAddress.Any, 0);
IPEndPoint[,] playerList = new IPEndPoint[5000, 2]; // 5000 possible player lobbies, each with 2 player ip addresses and ports
int playerListIndex = 0; // we start filling up the lobbies from 0
bool waitingForSecondClient;
public UDPServer(IPEndPoint serverIpEndPoint)
{
bufferSize = 1024;
byteData = new byte[1024];
localIPEP = serverIpEndPoint;
serverSocket = new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
serverSocket.Bind(localIPEP);
Console.WriteLine("Server setup complete.");
}
public void GetConnection()
{
while (true)
{
allDone.Reset();
Console.WriteLine("Waiting for new client.");
serverSocket.BeginReceiveFrom(byteData, 0, bufferSize, SocketFlags.None, ref sender, ClientConnected, sender);
allDone.WaitOne();
}
}
public void ClientConnected(IAsyncResult asyncResult)
{
allDone.Set();
byte[] data = new byte[1024];
data = byteData;
byteData = null;
Socket clientSocket = asyncResult.AsyncState as Socket;
EndPoint remote = clientSocket.LocalEndPoint;
int bytesReceived = serverSocket.EndReceiveFrom(asyncResult, ref remote);
string message = Encoding.ASCII.GetString(data, 0, bytesReceived);
remote = new IPEndPoint(IPAddress.Any, 0);
serverSocket.BeginReceiveFrom(byteData, 0, bufferSize, SocketFlags.None, ref remote, ClientConnected, remote);
Console.WriteLine("-------------");
Console.WriteLine("Received bytes of data: " + bytesReceived);
Console.WriteLine("-------------");
Console.WriteLine("Received string: " + message);
Console.WriteLine("-------------");
if (message.Equals("New client"))
{
Send(clientSocket, "Hello");
}
我也有這個錯誤,我最終解決了它,就像這樣
示例: github 上的示例
using System.Net;
using System.Net.Sockets;
public class UdpListenZ
{
public List<Socket> connections { get; private set; } = new List<Socket>();
public IPAddress address { get; private set; } = IPAddress.Any;
public int port { get; private set; } = 0;
public IPEndPoint localEndPoint { get; private set; } = new IPEndPoint(0, 0);
public Socket listen { get; set; } = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
private byte[] received { get; set; } = new byte[1];
private EndPoint point = new IPEndPoint(IPAddress.Any, 0);
public event EventZ.Connect OnConnect;
public event EventZ.Receive OnReceive;
public event EventZ.Disconnect OnDisconnect;
public void Init(IPAddress address, int port)
{
this.address = address;
this.port = port;
this.localEndPoint = new IPEndPoint(address, port);
}
public void Start()
{
listen.Bind(localEndPoint);
ReceiveNow();
}
private void ReceiveNow()
{
received = new byte[1024 * 4];
point = new IPEndPoint(IPAddress.Any, 0) as EndPoint;
listen.BeginReceiveFrom(received, 0, received.Length, SocketFlags.None, ref point, Receive, point);
}
private void Receive(IAsyncResult result)
{
var point = result.AsyncState as EndPoint;
var size = listen.EndReceiveFrom(result, ref point);
var data = new byte[size];
Array.Copy(received, data, data.Length);
OnReceive?.Invoke(data, point);
ReceiveNow();
}
public void Stop()
{
listen?.Close();
connections.Clear();
listen?.Dispose();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.