Это нормально, чтобы не вызывать Socket.close () - PullRequest
0 голосов
/ 06 июня 2019

Я настраиваю сервер, используя c #, он имеет бесконечный цикл, содержащий Socket.ReceiveFrom, поэтому приложение всегда будет бездействующим, пока не получено сообщение, проблема в том, что я прочитал на веб-сайте: «Когда приложение завершеноДля связи по сокету необходимо закрыть соединение, чтобы освободить ресурс ", значит ли это, что при каждом получении сообщения о закрытии сокета?

это означает, что мне нужно повторно инициализировать конструкторсокета каждый раз, когда цикл повторяется сам, поэтому я искал: «автоматически ли сокеты закрываются, когда приложение завершается», но не нашел ответа на этот вопрос.

следующие два кодапоясню:

static void Main(string[] args)
{
    // With out closing
    byte[] data = new byte[1024];

    IPEndPoint endpoint = new IPEndPoint(IPAddress.Any, 8888);

    Socket sckt = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    sckt.Bind(endpoint);

    IPEndPoint senderEndPoint = new IPEndPoint((long)IPAddress.Any.AddressFamily, 0);

    EndPoint remote = (EndPoint)endpoint;
    Console.WriteLine("Listening");

    while (true)
    {
        // receive data from sender
        int recv = sckt.ReceiveFrom(data, ref remote);

        // Get sender ip address
        senderEndPoint = (IPEndPoint)remote;
        Console.WriteLine(senderEndPoint.Address.ToString());

        string message = Encoding.ASCII.GetString(data, 0, recv);
        // Console.WriteLine(message);
        if (message.Equals("test"))
            //do something
    }
}

С закрытием:

    static void Main(string[] args)
            {
               Console.WriteLine("Listening");
               while (true)
                 {
                 byte[] data = new byte[1024];

                IPEndPoint endpoint = new IPEndPoint(IPAddress.Any, 8888);

                Socket sckt = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                sckt.Bind(endpoint);

                IPEndPoint senderEndPoint = new IPEndPoint((long)IPAddress.Any.AddressFamily, 0);

                EndPoint remote = (EndPoint)endpoint;



                    //receive data from sender
                    int recv = sckt.ReceiveFrom(data, ref remote);

                    //Get sender ip address
                    senderEndPoint = (IPEndPoint)remote;
                    Console.WriteLine(senderEndPoint.Address.ToString());


                    string message = Encoding.ASCII.GetString(data, 0, recv);
                    //Console.WriteLine(message);
                    if (message.Equals("lol"))
                        //do something

                    sckt.Close();


                }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...