private IPEndPoint FindReachableEndpoint(ClientInfo CI) { if (OnResultsUpdate != null) OnResultsUpdate.Invoke(this, "Attempting to Connect via LAN"); for (int ip = 0; ip < CI.InternalAddresses.Count; ip++) { if (!TCPClient.Connected) break; IPAddress IP = CI.InternalAddresses[ip]; IPEndPoint EP = new IPEndPoint(IP, CI.InternalEndpoint.Port); for (int i = 1; i < 4; i++) { if (!TCPClient.Connected) break; if (OnResultsUpdate != null) OnResultsUpdate.Invoke(this, "Sending Ack to " + EP.ToString() + ". Attempt " + i + " of 3"); SendMessageUDP(new Ack(LocalClientInfo.ID), EP); Thread.Sleep(200); Ack Responce = AckResponces.FirstOrDefault(a => a.RecipientID == CI.ID); if (Responce != null) { if (OnResultsUpdate != null) OnResultsUpdate.Invoke(this, "Received Ack Responce from " + EP.ToString()); CI.ConnectionType = ConnectionTypes.LAN; AckResponces.Remove(Responce); return EP; } } } if (CI.ExternalEndpoint != null) { if (OnResultsUpdate != null) OnResultsUpdate.Invoke(this, "Attempting to Connect via Internet"); for (int i = 1; i < 100; i++) { if (!TCPClient.Connected) break; if (OnResultsUpdate != null) OnResultsUpdate.Invoke(this, "Sending Ack to " + CI.ExternalEndpoint + ". Attempt " + i + " of 99"); SendMessageUDP(new Ack(LocalClientInfo.ID), CI.ExternalEndpoint); Thread.Sleep(300); Ack Responce = AckResponces.FirstOrDefault(a => a.RecipientID == CI.ID); if (Responce != null) { if (OnResultsUpdate != null) OnResultsUpdate.Invoke(this, "Received Ack New from " + CI.ExternalEndpoint.ToString()); CI.ConnectionType = ConnectionTypes.WAN; AckResponces.Remove(Responce); return CI.ExternalEndpoint; } } if (OnResultsUpdate != null) OnResultsUpdate.Invoke(this, "Connection to " + CI.Name + " failed"); } else { if (OnResultsUpdate != null) OnResultsUpdate.Invoke(this, "Client's External EndPoint is Unknown"); } return null; }
public MessageReceivedEventArgs(ClientInfo _clientInfo, Message _message, IPEndPoint _establishedEP) { clientInfo = _clientInfo; message = _message; EstablishedEP = _establishedEP; }
public void ConnectToClient(ClientInfo CI) { Req R = new Req(LocalClientInfo.ID, CI.ID); SendMessageTCP(R); if (OnResultsUpdate != null) OnResultsUpdate.Invoke(this, "Sent Connection Request To: " + CI.ToString()); Thread Connect = new Thread(new ThreadStart(delegate { IPEndPoint ResponsiveEP = FindReachableEndpoint(CI); if (ResponsiveEP != null) { if (OnResultsUpdate != null) OnResultsUpdate.Invoke(this, "Connection Successfull to: " + ResponsiveEP.ToString()); if (OnClientConnection != null) OnClientConnection.Invoke(CI, ResponsiveEP); } })); Connect.IsBackground = true; Connect.Start(); }