public ClientStatus(MessageClientServer_Client msg)
 {
     msgtype         = MessageTypes.MSG_NEW;
     label           = msg.label;
     machine_serial  = msg.machine_serial;
     report          = msg;
     report_last     = msg.msg_number;
     report_lost     = 0;
     report_received = 1;
 }
    //returns the amount of lost messages since last time (current - last)
    //assumes input is matching
    public ulong Update(MessageClientServer_Client msg)
    {
        //first get lost
        ulong lost = msg.msg_number - report_last;

        report = msg;
        ++report_received;
        report_last  = msg.msg_number;
        msgtype      = msg.msgtype;
        report_lost += lost;
        return(lost);
    }
    //add/update, will check
    public ulong Input(MessageClientServer_Client msg)
    {
        //find, if new
        int idx = client_list.FindIndex(x => x.machine_serial == msg.machine_serial);

        if (idx < 0)
        {
            client_list.Add(new ClientStatus(msg));
            return(0);
        }
        else //if update
        {
            return(client_list[idx].Update(msg));
        }
    }
        //==================================================
        //                  SendUDP(msg)
        //==================================================
        //chose UDP since... many computer trashing hte network for a non-critical function...
        //...might as well be lightweight
        //for reliability, red flag if missing several checkins, not just one
        //UDP data
        static void SendUDP(MessageClientServer_Client msg)
        {
            // This constructor arbitrarily assigns the local port number.
            UdpClient udpClient = new UdpClient(port);

            try
            {
                Console.Write("Connecting...");
                udpClient.Connect(srv_address, srv_port);
                Console.WriteLine("gonna send:" + msg.label + ";" + msg.msg);
                // Sends a message to the host to which you have connected.
                MemoryStream ms = new MemoryStream();
                Serializer.Serialize(ms, msg);
                Byte[] sendBytes = ms.ToArray();
                udpClient.Send(sendBytes, sendBytes.Length);

                // Sends a message to a different host using optional hostname and port parameters.
                //udpClientB.Send(sendBytes, sendBytes.Length, "AlternateHostMachineName", 11000);

                //IPEndPoint object will allow us to read datagrams sent from any source.
                IPEndPoint RemoteIpEndPoint = new IPEndPoint(srv_address, 0);

                // Blocks until a message returns on this socket from a remote host.
                Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);
                string returnData   = Encoding.ASCII.GetString(receiveBytes);

                // Uses the IPEndPoint object to determine which of these two hosts responded.
                Console.WriteLine("This is the message you received " +
                                  returnData.ToString());
                Console.WriteLine("This message was sent from " +
                                  RemoteIpEndPoint.Address.ToString() +
                                  " on their port number " +
                                  RemoteIpEndPoint.Port.ToString());

                udpClient.Close();
            }
            catch (SocketException e)
            {
                Console.WriteLine("Could not connect to server (" + srv_address + ":" + srv_port + ")");
                Console.WriteLine(e.Message);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }
 //update existing
 public ulong Update(int idx, MessageClientServer_Client msg)
 {
     return(client_list[idx].Update(msg));
 }
 public void Add(MessageClientServer_Client msg)
 {
     client_list.Add(new ClientStatus(msg));
 }
        static void RunServer()
        {
            while (!serverQuit)
            {
                // Blocks until a message returns on this socket from a remote host.
                Byte[] receiveBytes = udpClients.Receive(ref remoteIpClients);
                // Sends a message to the host to which you have connected.

                MemoryStream ms = new MemoryStream(receiveBytes);
                MessageClientServer_Client msg = (MessageClientServer_Client)Serializer.Deserialize <MessageClientServer_Client>(ms);
                // Uses the IPEndPoint object to determine which of these two hosts responded.
                //msg received
                //check serial against serials we have
                //http://stackoverflow.com/questions/9854917/how-can-i-find-a-specific-element-in-a-listt
                lock (clients_lock)
                {
                    int idx = clients.client_list.FindIndex(x => x.machine_serial == msg.machine_serial);
                    Console.WriteLine("=====");
                    //Console.WriteLine("idx:" + idx);
                    if (idx < 0) //if new
                    {
                        clients.client_list.Add(new ClientStatus(msg));
                        if (msg.msgtype == MessageTypes.MSG_NEW)
                        {
                            Console.WriteLine("New client - Started");
                        }
                        else if (msg.msgtype == MessageTypes.MSG_UPDATEPUSH)
                        {
                            Console.WriteLine("New client - reported");
                        }
                        else
                        {
                            Console.WriteLine("New client - ERRORS!!" + msg.msgtype);
                        }
                    }
                    else //if update
                    {
                        ulong missed = clients.client_list[idx].Update(msg);
                        if (msg.msgtype == MessageTypes.MSG_UPDATEPUSH)
                        {
                            Console.WriteLine("Known client - reported" + " Lost:" + missed);
                        }
                        else if (msg.msgtype == MessageTypes.MSG_NEW)
                        {
                            Console.WriteLine("Known client - Started");
                        }
                        else
                        {
                            Console.WriteLine("Known client - ERRORS!!" + msg.msgtype + " Lost:" + missed);
                        }
                    }
                }//lock clients_lock
                Console.WriteLine(msg.label + " said " + msg.msg);
                Console.WriteLine("Sent from " +
                                  remoteIpClients.Address.ToString() +
                                  " on their port:" +
                                  remoteIpClients.Port.ToString());
                //Console.WriteLine("=====objdump=====");
                //msg.output();
                //send back
                Byte[] sendBytes = Encoding.ASCII.GetBytes("Hi " +
                                                           remoteIpClients.Address.ToString() +
                                                           " Got your messsage!");
                udpClients.Send(sendBytes, sendBytes.Length, remoteIpClients);
            }//!serverquit
        }