Main Site Documentation

Strange things regarding sockets and ethernet connection


#1

This is my code :

void ethernet_J11D_NetworkUp(GTM.Module.NetworkModule sender, GTM.Module.NetworkModule.NetworkState state)
        {

            Debug.Print("Network Up!");
            Thread.Sleep(1000);
            ipAddress = ethernet_J11D.NetworkSettings.IPAddress;
            Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            System.Net.IPAddress ipaddressReady = System.Net.IPAddress.Parse(ipAddress);
            System.Net.IPEndPoint localEndPoint = new System.Net.IPEndPoint(ipaddressReady, port);
            server.Bind(localEndPoint);
            server.Listen(1);
            while (true)
            {
                try
                {
                    Socket clientSocket = server.Accept();
                    // Process the client request.  true means asynchronous.
                    new ProcessClientRequest(clientSocket, true);
                }
                catch (System.Net.Sockets.SocketException e)
                {
                    server.Close();
                }
            }
        }

Everything works fine but sometimes the while true loop got stuck somehow and my gadgeteer won’t accept new connections. I’m trying to connect to the gadgeteer via sockets, I ran it on Visual studio 2010 and sometimes nothing happened. I decided to put a breaking point (while the program was running) on the while (true) line, Then it became yellow which means that the loop got stuck, I pressed play (to jump to the next command) and suddenly new connection was accepted.

What is this???


#2

you have a loop inside an event handler. this is a BIG no no! all sorts of strange things can happen.

do your incoming connection acceptance in a separate thread, created in the network up event handler.


#3

I changed it now, let’s hope for the best.


#4

I did it, but it seems that after a sometime that there are no incoming connections, It goes to sleep and no new connections accepted because the while loop dies for some reason.


#5

Dies? without seeing your code, I can only guess that there is an unhandled exception. add a catch(Exception), and print out the associated message.

how many connections have occurred before the problem appears? Often, improper closing/disposal of sockets results in the maximum number of sockets being used.

I suggest that you write, and post, a simple program which accepts connections, does dummy processing, and then terminates the connection. that will let us look at the entire situation.


#6

There is a strange issue with NETMF (not sure if GHI related or not), when a debug session is open.
The program suddenly stops as if it ran on a break point.
If you press pause, and then continue in VS, the program runs again.
This does usually not happen on very simple projects. But as soon as a projects gets more complex (Networking, Threads, …) it happens more often.
If no debugger is attached, the program runs just fine without any issues.

And as Mike already posted:
Never do “real work” in an event handler, or in an timer event.
NETMF runs a lot of these events on a single thread, and as long as a event is executed, no other event that is processed on this one thread will be fired.
And also put a try/catch block in every event handler and thread proc. If a exception is not caught there, the whole program will crash and the board reboots.

I have created a ThreadPool class to simply spawn an async operation without creating new threads all the time.
You can find it on CodeShare.


#7

@ Reinhard Ostermeier - This is what I’m talking about, So, if the visual studio not working, the gadgeteer should accept new connections anytime?


#8

If no debug session is running (Board starts after power up or reset button) then the ‘Break’ like I meant did never happen to me, so it should accept connections at any time.
Only when debugging with VS I saw this imaginary breakpoints.


#9

@ Reinhard Ostermeier - Has it occurred to you in VS 2010 or 2010?