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 }