The code showed below is working fine, but I face this problem on G400 and Hydra 4.3b2 fw:
- G400 and Hydra HttpListner/sockets starts fine only if in VS debug mode.
- EMX Spider works fine in any condition. (It uses BuiltIn Ethernet)
My first impression is that something is running too fast on G400/Hydra board and so for some reason it’s messing up network … but I couldn’t find the problem.
In 4.2 the problem doesn’t show up in any board.
...
void ProgramStarted()
{
// Serial port startup
PubRs232 = rs232;
rs232.Configure(19200, GT.SocketInterfaces.SerialParity.None, GT.SocketInterfaces.SerialStopBits.One, 8, GT.SocketInterfaces.HardwareFlowControl.NotRequired);
rs232.Port.Open();
button.TurnLedOn();
//readadc = new AutoResetEvent(false);
//adc = new Ledonet.Adc3424Board.AdcMcp3424(ADCSOCKET);
pTcp = new TcpManager("192.168.20.77", "192.168.20.1", "255.255.255.0", "");
// Use Debug.Print to show messages in Visual Studio's "Output" window during debugging.
//StartSDLogger(sdCard);
//SetupAdc();
//button.ButtonPressed += button_ButtonPressed;
button.TurnLedOff();
Debug.Print("Program Started");
}
public TcpManager(string ipaddr, string gwaddr, string netmask, string ntpserver)
{
_boardIp = ipaddr;
_boardGw = gwaddr;
_boardNetmask = netmask;
_NtpServer = ntpserver;
StartEthernet();
SMSHttpListenerThread = new Thread(new ThreadStart(TcpThreadManager));
SMSHttpListenerThread.Start();
TimeServerRun2(_NtpServer);
}
static void StartEthernet()
{
Eth1 = CreateEthernetInterface();
NetworkChange.NetworkAddressChanged += new NetworkAddressChangedEventHandler(Eth1_NetworkAddressChanged);
NetworkChange.NetworkAvailabilityChanged += new NetworkAvailabilityChangedEventHandler(Eth1_CableConnectivityChanged);
Eth1.PhysicalAddress = new byte[] { 0x00, 0xC0, 0x03, 0x00, 0xC1, 0x16 }; // MACADDR: 00-C0-03-00-C1-03
Eth1.EnableStaticIP(_boardIp, _boardNetmask, _boardGw); // class C net
string [] DnsAddresses = new string[] { "8.8.8.8" , "192.168.20.1"};
Eth1.EnableStaticDns(DnsAddresses);
Eth1.Open();
NetworkAddrChangeBlocking = new ManualResetEvent(false);
if (!Eth1.CableConnected)
{
NetworkAvailablityBlocking = new ManualResetEvent(false);
do
{
if (!Eth1.CableConnected)
{
DebugPrint.Print("Ethernet cable is not connected yet.");
}
else
break;
}
while (!NetworkAvailablityBlocking.WaitOne(5000, false));
}
DebugPrint.Print("Try to set IP addr ....");
while (IPAddress.GetDefaultLocalAddress() == IPAddress.Any || !NetworkAddrChangeBlocking.WaitOne(500, false))
{
Thread.Sleep(50);
}
DebugPrint.Print("IP address is set " + Eth1.IPAddress.ToString()); //+ " - " + EthernetENC28J60.ActiveInterface.IPAddress);
}
static void Eth1_CableConnectivityChanged(object sender, NetworkAvailabilityEventArgs e)
{
DebugPrint.Print("Built-in Ethernet Cable is " + (e.IsAvailable ? "Connected!" : "Disconnected!"));
if (e.IsAvailable)
{
if ( NetworkAvailablityBlocking != null)
NetworkAvailablityBlocking.Set();
}
}
static void Eth1_NetworkAddressChanged(object sender, EventArgs e)
{
DebugPrint.Print("New address for The built-in Ethernet Network Interface ");
DebugPrint.Print("Is DhCp enabled: " + Eth1.IsDhcpEnabled);
DebugPrint.Print("Is DynamicDnsEnabled enabled: " + Eth1.IsDynamicDnsEnabled);
DebugPrint.Print("NetworkInterfaceType " + Eth1.NetworkInterfaceType);
DebugPrint.Print("Network settings:");
DebugPrint.Print("IP Address: " + Eth1.IPAddress);
DebugPrint.Print("Subnet Mask: " + Eth1.SubnetMask);
DebugPrint.Print("Default Getway: " + Eth1.GatewayAddress);
DebugPrint.Print("Number of DNS servers:" + Eth1.DnsAddresses.Length);
/*
for (int i = 0; i < Eth1.DnsAddresses.Length; i++)
DebugPrint.Print("DNS Server " + i.ToString() + ":" + Eth1.DnsAddresses[i]);
*/
DebugPrint.Print("----------------------------------------------");
NetworkAddrChangeBlocking.Set();
}
static HttpListener listener;
//***************************************************************************
void TcpThreadManager()
{
// setup thread
listener = null;
HttpListenerContext wctx = null;
Thread.Sleep(500);
DebugPrint.Print("HttpListener thread started ....");
while (true)
{
// wait for call from client:
try
{
if (listener == null)
{
listener = new HttpListener("http", 8080);
//listener.MaximumResponseHeadersLength = 4096;
listener.Start();
DebugPrint.Print("HttpListener created....");
}
wctx = listener.GetContext();
// got call:
//DebugPrint.Print("Got Call !");
if (wctx.Request == null)
continue;
//SdCardUtility.LogPrint("URL: " + wctx.Request.RawUrl);
}
catch (SocketException)
{
DebugPrint.Print("HttpListener stopped, cleared then restart it ... !");
if (listener != null)
{
//listener.Stop();
listener.Close();
listener = null;
Thread.Sleep(5000);
}
continue;
}
// Process request
ProcessHttpRequest(wctx); // threaded version
//HttpContextServiceThread(wctx); // single version (don't use!)
}
}
void ProcessHttpRequest(HttpListenerContext wctx)
{
Thread _servicethread = new Thread(
delegate()
{
HttpContextServiceThread(wctx);
}
);
_servicethread.Start();
}
To note that TimeServer is running fine on all the boards although the HttpListener is not responding. The boards are all pingable.