Help with UDP Listening Service. It is hanging... is just stops.
I have a Service running on Windows Server 2008 64bit. The service worked
perfectly on Server 2003 32bit, so I'm not sure if it is the new server and
the 64bit processor that's causing this, but it's happening and I need help
fixing it.
I have a windows service that loads up all GPS Listeners that I have in a
directory (factories). Each listener listens on a specific port, and has it's
own functionality to translate the data coming in.
What happens is randomly one of them stops listening, almost like it just
hangs. I'm not sure if the thread stops, or what... but it keeps doing it.
On average I get about 30 GPS hits a second on our server.
I just added the restart function in hopes it would try to kickstart it
again if something happened. I am not getting any system logs or any error
messages when it stops. It just stops listening like it's hung.
Here is the bulk of my listener:
public bool Start()
{
Client.Settings.Settings.WriteMessage("Enfora - Start Function Begining -
listening on port:." + _port.ToString() + "." + DateTime.Now.ToString(),
System.Reflection.Assembly.GetExecutingAssembly().GetName().Name);
_listener = new UdpClient(_port);
_thread = new Thread(Listen);
_thread.Name = "UDPGetEnforaData";
_thread.Start();
Client.Settings.Settings.WriteMessage("Enfora - Start Function Ending." +
DateTime.Now.ToString(),
System.Reflection.Assembly.GetExecutingAssembly().GetName().Name);
Client.Settings.Settings.WriteMessage(" Results: _listener:" + _listener ==
null ? "NULL" : "Created",
System.Reflection.Assembly.GetExecutingAssembly().GetName().Name);
Client.Settings.Settings.WriteMessage(" _thread:" + _thread == null ? "NULL"
: "Created",
System.Reflection.Assembly.GetExecutingAssembly().GetName().Name);
Client.Settings.Settings.WriteMessage(" _thread status:" + _thread.IsAlive,
System.Reflection.Assembly.GetExecutingAssembly().GetName().Name);
return true;
}
private void Listen()
{
byte[] ddata;
bool error = false;
while (true)
{
try
{
Client.Settings.Settings.WriteMessage("Enfora Listen()");
IPEndPoint remoteIPEndpoint = new IPEndPoint(IPAddress.Any, _port);
ddata = _listener.Receive(ref remoteIPEndpoint);
DataArrival(remoteIPEndpoint.Address.ToString(), ddata);
}
catch (Exception e)
{
Settings.writeErrorToLog("Error while recieving Enfora UDP Data." +
Environment.NewLine + e.Message);
error = true;
break;
}
}
if (error)
{
Restart();
}
}
private void DataArrival(string ip, byte[] data)
{
Settings.WriteMessage("Enfora Data Arrival Hit", _currentAssembly);
string strData = string.Empty;
try
{
// set last IP
strData = Server.Device.Base.Utility.DumpHexData(data);
string[] d = new string[2];
string[] t = strData.Split(',');
d[0] = t[0].Split(' ')[((string[])t[0].Split(' ')).Length - 2];
d[1] = strData.Substring(strData.IndexOf('$'));
if (data[0] == 0x00 && data[1] == 0x0A && data[2] == 0x02 && data[3] == 0x00)
{
// wake-up/keep alive message
byte[] outBytes = { 0x00, 0x0A, 0x01, 0x00 };
SendWakeup(outBytes, ip, _port);
}
else
{
_id = t[0].Split(' ')[((string[])t[0].Split(' ')).Length - 2];
_message = strData.Substring(strData.IndexOf('$'));
Settings.WriteMessage("Message : " + _message, _currentAssembly);
Update(_id, _message);
}
}
catch (Exception ex)
{
Settings.writeErrorToLog("Error while recieving Enfora UDP Data.
EnforaDataArrival(ip, data)." + Environment.NewLine + "strData:" + strData +
Environment.NewLine + ex.Message);
}
}
private void Restart()
{
Client.Settings.Settings.WriteMessage("*********ENFORA RESTARTING");
_listener.Close();
_listener = null;
_listener = new UdpClient(_port);
Listen();
}