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