簡體   English   中英

C# 異步 UDP 服務器 - 如何將套接字傳遞給回調

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM