首页 > 解决方案 > 时间:2019-04-10 标签:c#async udp server closes after initiating

问题描述

我是编码新手,尤其是异步编码,并且第一次尝试在 udp 服务器上为我正在开发的游戏(1v1)实现它。在同步 udp 服务器中,当我们接收时代码停止,那么我如何在异步中做同样的事情?目前,控制台通过 GetConnection() 方法并简单地关闭,而不是等待客户端。请帮忙。

// State object for reading client data asynchronously  
public class StateObject
{
    // Client  socket.  
    public Socket clientSocket = null;
    // Size of receive buffer.  
    public const int BufferSize = 1024;
    // Receive buffer.  
    public byte[] buffer = new byte[BufferSize];
    // Received data string.  
    public StringBuilder sb = new StringBuilder();
}


class UDPServer
{
    Socket serverSocket;
    IPEndPoint localIPEP;
    IPEndPoint senderIPEP;
    EndPoint sender;

    IPEndPoint[,] playerList; 
    int playerListIndex;

    bool waitingForSecondClient;

    public UDPServer(IPEndPoint serverIpEndPoint)
    {
        localIPEP = serverIpEndPoint;
        serverSocket = new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);

        serverSocket.Bind(localIPEP);

        senderIPEP = new IPEndPoint(IPAddress.Any, 0);
        sender = senderIPEP;

        playerList = new IPEndPoint[5000, 2]; // 5000 possible player lobbies, each with 2 player ip addresses and ports
        playerListIndex = 0; // we start filling up the lobbies from 0
        Console.WriteLine("Server setup complete.");
    }

    public void GetConnection()
    {
        StateObject state = new StateObject();
        Console.WriteLine("Waiting for new client.");
        serverSocket.BeginReceiveFrom(state.buffer, 0, StateObject.BufferSize, SocketFlags.None,ref sender, ClientConnected, state);
    }

    public void ClientConnected(IAsyncResult asyncResult)
    {
        StateObject state = (StateObject)asyncResult;
        EndPoint remote = state.clientSocket.LocalEndPoint;
        StateObject tempState = new StateObject();
        int bytesReceived = serverSocket.EndReceiveFrom(asyncResult, ref remote);
        serverSocket.BeginReceiveFrom(tempState.buffer, 0, StateObject.BufferSize, SocketFlags.None, ref remote, ClientConnected, tempState);


        Console.WriteLine("-------------");
        Console.WriteLine("Received bytes of data: " + bytesReceived);
        Console.WriteLine("-------------");
        Console.WriteLine("Received string: " + state.sb.ToString());
        Console.WriteLine("-------------");

        if (state.sb.ToString().Equals("New client"))
        {
            Send(state.clientSocket, "Hello");
        }
    }

    private void Send(Socket client,string message)
    {
        EndPoint remote = client.LocalEndPoint;

        StateObject state = new StateObject();

        // Begin sending the data to the remote device.  
        serverSocket.BeginSendTo(state.buffer, 0, StateObject.BufferSize, 0,remote,SendCallback,state);
    }

    private static void SendCallback(IAsyncResult asyncResult)
    {
        // Retrieve the socket from the state object.  
        Socket client = (Socket)asyncResult.AsyncState;

        // Complete sending the data to the remote device.  
        int bytesSent = client.EndSendTo(asyncResult);
    }

    static void Main(string[] args)
    {
        UDPServer server = new UDPServer(new IPEndPoint(IPAddress.Any, 9050));
        server.GetConnection();
    }
}

标签: c#asynchronousserverudp

解决方案


这并不能直接解决您的问题,但是您看过System.IO.Pipelines吗?它的设计正是为了帮助使用 async/await 范式处理异步流。

https://blogs.msdn.microsoft.com/dotnet/2018/07/09/system-io-pipelines-high-performance-io-in-net/


推荐阅读