Gerardo Contijoch
Gerardo Contijoch

Reputation: 2501

Lost UDP 'connection' between client app and server app

I wrote two small applications (a client and a server) to test UDP communication and I found the 'connection' (yeah, I know, there's no real connection) between them gets lost frecuently for no reason.

I know UDP is an unreliable protocol, but the problem here does not seem the losing of packets, but the losing of the communication channel between the apps.

Here's client app code:

    class ClientProgram
    {
        static void Main(string[] args)
        {
            var localEP = new IPEndPoint(GetIPAddress(), 0);

            Socket sck = new UdpClient(localEP).Client;
            sck.Connect(new IPEndPoint(IPAddress.Parse("[SERVER_IP_ADDRESS]"), 10005));

            Console.WriteLine("Press any key to request a connection to the server.");
            Console.ReadLine();

            // This signals the server this clients wishes to receive data
            SendData(sck);

            while (true)
            {
                ReceiveData(sck);
            }
        }

        private static void ReceiveData(Socket sck)
        {
            byte[] buff = new byte[8];
            int cnt = sck.Receive(buff);

            long ticks = BitConverter.ToInt64(buff, 0);

            Console.WriteLine(cnt + " bytes received: " + new DateTime(ticks).TimeOfDay.ToString());
        }

        private static void SendData(Socket sck)
        {
            // Just some random data
            sck.Send(new byte[] { 99, 99, 99, 99 });
        }

        private static IPAddress GetIPAddress()
        {
            IPHostEntry he = Dns.GetHostEntry(Dns.GetHostName());
            if (he.AddressList.Length == 0)
                return null;

            return he.AddressList
                .Where(ip => ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork && !IPAddress.IsLoopback(ip))
                .FirstOrDefault();
        }
    }

Here's the server app code:

    class ServerProgram
    {
        private static int SLEEP = 5;
        static void Main(string[] args)
        {
            // This is a static IP address
            var localEP = new IPEndPoint(GetIPAddress(), 10005);

            Socket sck = new UdpClient(localEP).Client;

            // When this methods returs, a client is ready to receive data
            var remoteEP = ReceiveData(sck);

            sck.Connect(remoteEP);

            while (true)
            {
                SendData(sck);
                System.Threading.Thread.Sleep( ServerProgram.SLEEP * 1000);
            }
        }

        private static EndPoint ReceiveData(Socket sck)
        {
            byte[] buff = new byte[8];
            EndPoint clientEP = new IPEndPoint(IPAddress.Any, 0);

            int cnt = sck.ReceiveFrom(buff, ref clientEP);

            Console.WriteLine(cnt + " bytes received from " + clientEP.ToString());

            return (IPEndPoint)clientEP;
        }

        private static void SendData(Socket sck)
        {
            DateTime n = DateTime.Now;
            byte[] b = BitConverter.GetBytes(n.Ticks);
            Console.WriteLine("Sending " + b.Length + " bytes : " + n.TimeOfDay.ToString());
            sck.Send(b);
        }

        private static IPAddress GetIPAddress()
        {
            // Same as client app...
        }
    }

(this is just test code, don't pay attention to the infinite loops or lack of data validation)

The problem is after a few messages sent, the client stops receiving them. The server keeps sending, but the client gets stuck at sck.Receive(buff). If I change SLEEP constant to a value higher than 5, the 'connection' gets lost after 3 or 4 messages most of the time.

I can confirm the client machine doesn´t receive any packet when the connection is lost since I use Wireshark to monitor the communication.

The server app runs on a server with direct connection to Internet, but the client is a machine in a local network, behind a router. None of them has a firewall running.

Does anyone have a clue what could be happening here?

Thank you!

EDIT - Additional data:

I tested the client app in several machines in the same network and the connection get lost always. I also tested the client app in other network behind other router and there is no problem there. My router is a Linksys RV042 and never had any problem with it, in fact, this app is the only one with problems.


PROBLEM SOLVED - SHORT ANSWER:

It was a hardware problem.

Upvotes: 0

Views: 2584

Answers (1)

gabrtv
gabrtv

Reputation: 3588

I don't see any overt problems in the source code. If it is true that:

  1. The server keeps sending packets (confirmed by WireShark on the server)
  2. The client never receives the packets (confirmed by WireShark on the client)

..then the problem could be related to networking equipment between the two machines, which don't always handle UDP flows as expected especially when behind routers/firewalls.

I would recommend the following approach to troubleshooting:

  1. Run client & server on the same system and use the loopback interface (confirm UDP code works on the loopback)
  2. Run the client & server on two different systems that are plugged into the same Ethernet switch (confirm that UDP communication works switch-local)

If everything works switch-local you can be fairly sure you have a network configuration problem.

Upvotes: 1

Related Questions