C# сервер async udp закрывается после запуска

Я новичок в кодировании, особенно с async, и впервые пытаюсь реализовать его на сервере udp для игры, над которой я работаю (1v1). На синхронном udp-сервере код останавливается, когда мы получаем от, так как я могу сделать то же самое в async? В настоящее время консоль проходит через метод 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();
    }
}

Вашему приложению по-прежнему нужен цикл приложения, чтобы поддерживать процесс в рабочем состоянии, пока серверный сокет отвечает. Поток цикла не делает ничего, кроме ожидания чего-то вроде нестабильного флага, который может быть установлен, например, обработчиком исключений или каким-либо другим сигналом, чтобы дать серверу команду завершить работу. Не уверен, что в .Net были лучшие разработки, но из памяти цикл приложения просто выполнял бы Thread.Sleep (1000), чтобы каждую секунду проверять состояние флага. Хорошим местом для начала было бы ознакомление с примерами C# и DirectX.

Steve Py 21.09.2018 00:25
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
246
1

Ответы 1

Это не решает напрямую вашу проблему, но смотрели ли вы на System.IO.Pipelines? Он был разработан именно для помощи в обработке асинхронных потоков с использованием парадигмы async / await.

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

Другие вопросы по теме