Программа асинхронного сервера CSharp сразу закрывается при запуске - PullRequest
0 голосов
/ 20 сентября 2018

Я довольно новичок в программировании, и я только что написал свой первый асинхронный сервер, но как только я запускаю программу, она закрывается сразу после написания в ожидании нового клиента, может кто-нибудь мне помочь?Я не знаю, какую глупость я делаю.У меня есть класс UDPServer с некоторыми методами, из которых - UDPServer () получает ipendpoint ipaddress локального сервера и порт для инициализации (вызывается в main для создания нового объекта сервера UDP) - сразу после этого я вызываю метод get connection,который предположительно должен заставить сервер ждать нового клиента, но вместо этого он немедленно закрывается.

// 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();
    }
}

1 Ответ

0 голосов
/ 20 сентября 2018

BeginReceiveFrom Не блокируется, так как выполнение такой программы достигает конца основного метода и завершается.Я не уверен, что вы собираетесь использовать в качестве условия выхода, но вам понадобится какой-то код, обеспечивающий, чтобы сервер ожидал, пока это условие выхода не будет выполнено, прежде чем завершить выполнение программы.

...