UDPClient - renew connection

Odpowiedz Nowy wątek
2011-07-15 17:17
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..


~Jeśli jeszcze nie zwariowałeś, tzn. że jesteś niedoinformowany...
edytowany 1x, ostatnio: SkyLiNe, 2011-07-15 17:21

Pozostało 580 znaków

2011-07-16 23:27
0

Close() :>


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2011-07-17 22:29
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.


~Jeśli jeszcze nie zwariowałeś, tzn. że jesteś niedoinformowany...
edytowany 1x, ostatnio: SkyLiNe, 2011-07-17 22:29

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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