UDPClient - renew connection

0

Witam, mam problem z swoją klasą.

    public class UdpState
    {
        public UdpState() { }
        public IPEndPoint ipEndPoint;
        public UdpClient udpClient;
    }

    public class SimpleUDPClient
    {
        private string ip;
        private int port;
        private string error = "";
        private UdpClient udpClient;
        private IPEndPoint sender;
        private bool messageReceived = false;
        private UdpState udpState;
        Byte[] receiveBytes;

        public bool Connect(string ip, int port)
        {
            try
            {
                this.ip = ip;
                this.port = port;
                this.udpClient = new UdpClient(port);
                this.udpClient.Connect(ip, port);
                this.sender = new IPEndPoint(IPAddress.Any, 0);
                this.udpState = new UdpState();
                this.udpState.ipEndPoint = sender;
                this.udpState.udpClient = this.udpClient;
                return true;
            }
            catch (Exception e)
            {
                this.error = e.Message;
                return false;
            }
        }
        public bool Disconnect()
        {
            try
            {
                this.udpClient.Close();
                return true;
            }
            catch (Exception e)
            {
                this.error = e.Message;
                return false;
            }
        }
        private void ReceiveCallback(IAsyncResult ar)
        {
            try
            {
                UdpClient u = (UdpClient)((UdpState)(ar.AsyncState)).udpClient;
                IPEndPoint e = (IPEndPoint)((UdpState)(ar.AsyncState)).ipEndPoint;
                receiveBytes = u.EndReceive(ar, ref e);
                this.messageReceived = true;
            }
            catch (Exception e) { }
        }
        private bool SendData(Byte[] sendData)
        {
            this.udpClient.Send(sendData, sendData.Length);
            this.udpClient.BeginReceive(new AsyncCallback(ReceiveCallback), this.udpState);

            int counter = 0;
            while (!this.messageReceived && counter < 200)
            {
                Thread.Sleep(10);
                ++counter;
            }

            if (!this.messageReceived)
            {
                return false;
            }
            
            return true;
        }
    }

Funkcja SendData zwraca false, jeżeli nie uda się nic odebrać od serwera (jeżeli serwer nie odpowie). W takim przypadku próbowałem zwolnić i nawiązać połączenie ponownie:

obiektKlasySimpleUDPClient.Disconnect();
obiektKlasySimpleUDPClient.Connect("168.5.16.1", 50100);

Jednak dostaję wyjątek od this.Connect();, że socket zajęty i że tylko jedno połączenie dozwolone.

  1. Jak zaimplementować funkcję do odnawiania połączenia z użyciem klasy UDPClient, a nie Socket'ów - jeżeli oczywiście jest to możliwe.

  2. Jak zwalniać obiekt UDPClient? Widziałem, że ma to Dispose(), ale protected.

Ogólnie jak rozłączyć się całkowicie z serwerem, tak żeby nic go nie blokowało (oczywiście bez kasowania obiektu mojej klasy).
Nie wiem co się dzieje, że po 'ciągłej rozmowie z serwerem' nagle coś się w nim blokuje i przestaje odpowiadać i dopiero wyłączenie i włączenie mojego klienta powoduje, że mogą znowu zainicjować połączenie. Niestety nie mam dostępu do kodu źródłowego serwera..

0

Close() :>

0

Po tym, jak odpowiedź od serwera nie dojdzie, Close() nie zwalnia połączenia tak, że można go potem ustanowić poprzez Connect(). Wymagany jest całkowity reset aplikacji.

1 użytkowników online, w tym zalogowanych: 0, gości: 1