public RemotePeer Connect(string IPV4IP, int port) { socket.Connect(IPV4IP, port); //TODO is it reqired to check for the connect result? System.Net.IPAddress RemotePeerIPAddress = System.Net.IPAddress.Parse(IPV4IP); System.Net.IPEndPoint RemotePeerEndPoint = new System.Net.IPEndPoint(RemotePeerIPAddress, port); RemotePeer remotepeer = TouchPeer(RemotePeerEndPoint); if (remotepeer.RemotePeerType == RemotePeer.RemotePeerTypes.NotDeterminedYet) { remotepeer.RemotePeerType = RemotePeer.RemotePeerTypes.Master; } remotepeer.ResetReceives(); remotepeer.ResetSends(); Protocol message = new Protocol(); message.Header.SendType = ProtocolHeader.MessageSendType.Internal; message.Data.Data = "Hello"; Send(remotepeer, message); //ConnectionStatusChange(ConnectonStaus.Connecting, remotepeer); remotepeer.ConnectionStatusChange(RemotePeer.ConnectonStaus.Connecting); return(remotepeer); }
public RemotePeer Connect(string IPV4IP, int port) { socket.Connect(IPV4IP, port); Console.WriteLine("RUDPPeer: socket Connected to: " + IPV4IP + ":" + port); System.Net.IPAddress RemotePeerIPAddress = System.Net.IPAddress.Parse(IPV4IP); System.Net.IPEndPoint RemotePeerEndPoint = new System.Net.IPEndPoint(RemotePeerIPAddress, port); RemotePeer remotepeer = TouchPeer(RemotePeerEndPoint); remotepeer.RemotePeerType = RemotePeerTypes.Master; //SortedDictionary<int, Protocol > outgoingtmp = remotepeer.OutGoingMessageList; //remotepeer.Reset(); Protocol message = new Protocol(); message.Header.SendType = ProtocolHeader.MessageSendType.Internal; message.Data.Data = "Hello"; remotepeer.Send(message); // TDOO this line should be moved to ManageRemoteConnections to reconnect and stuff //remotepeer.ResendAllOutgoingMessages(outgoingtmp); remotepeer.ConnectionStatusChange(ConnectonStaus.Connecting); Console.WriteLine($"RUDPPeer: <<< Number of RemotePeerList connections: {RemotePeerList.Count}"); return(remotepeer); }
private void RemovePeer(RemotePeer remotepeer) { if (RemotePeerList.Contains(remotepeer)) { RemotePeerList.Remove(remotepeer); } }
public void removeRemotePeer(RemotePeer remotepeer) { if (RemotePeerList.Contains(remotepeer)) { RemotePeerList.Remove(remotepeer); } }
private void ManageRemoteConnections() { RemotePeer[] RemotePeerListCopy = RemotePeerList.ToArray(); var peeritr = RemotePeerListCopy.GetEnumerator(); while (peeritr.MoveNext()) { RemotePeer tmp = (RemotePeer)peeritr.Current; if (tmp.RemotePeerType == RemotePeerTypes.Master) { if (tmp.connectionStatus == ConnectonStaus.Disconnected) { // get a copy of the outgoing messages. SortedDictionary <int, Protocol> outgoingcopy = new SortedDictionary <int, Protocol>(); SortedDictionary <int, Protocol> lasttimeoutgoingcopy = new SortedDictionary <int, Protocol>(); if (tmp.ExternalOutGoingMessageList.Count > 0) { outgoingcopy = tmp.ExternalOutGoingMessageList; } else { lasttimeoutgoingcopy = tmp.OutgoingCopyForResend; } // disconnect Disconnect(); // removeRemotePeer the remotepeer IPEndPoint ipendpoint = tmp.ipEndPoint; Console.WriteLine("RUDPPeer: Remotepeer removed from RemotePeerList: " + tmp.ipEndPoint.Address.ToString() + ":" + tmp.ipEndPoint.Port); Console.WriteLine($"RUDPPeer: >>> Number of RemotePeerList connections: {RemotePeerList.Count}"); RemotePeerList.Remove(tmp); // connect InitializeSocket(); RemotePeer newpeer = Connect(ipendpoint.Address.ToString(), ipendpoint.Port); // resend if (outgoingcopy.Count > 0) { newpeer.OutgoingCopyForResend = outgoingcopy; } else { newpeer.OutgoingCopyForResend = lasttimeoutgoingcopy; } } } else if (tmp.RemotePeerType == RemotePeerTypes.Slave) { if (tmp.connectionStatus == ConnectonStaus.Disconnected) { // remove the remotepeer with all it has Console.WriteLine("RUDPPeer: Remotepeer removed from RemotePeerList: " + tmp.ipEndPoint.Address.ToString() + ":" + tmp.ipEndPoint.Port); RemotePeerList.Remove(tmp); } } else if (tmp.RemotePeerType == RemotePeerTypes.NotDeterminedYet) { throw new NotImplementedException(); } } }
private void ReceiveMessage() { try { if (socket.Available > 0) { int result = socket.ReceiveFrom(incommingBuffer, SocketFlags.None, ref SenderEndPoint); if (result > 0) { IPEndPoint ipendpoint = (IPEndPoint)SenderEndPoint; RemotePeer remotepeer = TouchPeer(ipendpoint); Protocol message = new Protocol(); message.DeserializeFromBytes(incommingBuffer); // if I don't know you, the message gotta be internal and a Hello! unless I'm gonna destroy that! if (remotepeer.RemotePeerType == RemotePeerTypes.NotDeterminedYet) { if ((message.Header.SendType == ProtocolHeader.MessageSendType.Internal) && (message.Data.Data == "Hello")) { remotepeer.RemotePeerType = RemotePeerTypes.Slave; } else { removeRemotePeer(remotepeer); RemotePeer.NotDeterminedYeteceiveCount++; return; } } if (message.Header.SendType == ProtocolHeader.MessageSendType.External) { if (message.Header.SequenceNumber < remotepeer.LastExternalDispatchedMessage) { remotepeer.TotalRedundantReceiveCount++; return; } } else if (message.Header.SendType == ProtocolHeader.MessageSendType.Internal) { if (message.Header.SequenceNumber < remotepeer.LastInternalDispatchedMessage) { remotepeer.TotalRedundantReceiveCount++; return; } } remotepeer.MessageReceived(message); remotepeer.MarkExternalIncommingsforAckDelivery(message.Header.ExternalAckList); remotepeer.MarkInternalIncommingsforAckDelivery(message.Header.InternalAckList); remotepeer.ExternalOutGoingAcksReceived(message.Header.ExternalAckList); remotepeer.InternalOutGoingAcksReceived(message.Header.InternalAckList); } } } catch (Exception e) { } }
private RemotePeer CreatePeer(IPEndPoint remotePeerEndPoint) { RemotePeer rp = new RemotePeer(OnConnectionStatusChange); rp.ipEndPoint = remotePeerEndPoint; RemotePeerList.Add(rp); return(rp); }
private void RealSend(RemotePeer remotepeer, Protocol message) { message.Header.AckList = remotepeer.GetIncommingMessageSequences(message.Header.SequenceNumber); message.Header.DispatchedList = remotepeer.GetDispatchedMessageSequences(message.Header.SequenceNumber); byte[] tosendbuffer = message.SerializeToBytes(); int e = socket.SendTo(tosendbuffer, remotepeer.ipEndPoint); message.Sent++; }
private RemotePeer TouchPeer(IPEndPoint remotePeerEndPoint) { RemotePeer rp = GetPeer(remotePeerEndPoint); if (rp != null) { return(rp); } rp = CreatePeer(remotePeerEndPoint); return(rp); }
private void CheckConnectivity() { List <RemotePeer> RemotePeerListCopy = RemotePeerList; var itr = RemotePeerListCopy.GetEnumerator(); while (itr.MoveNext()) { //if (itr.Current.RemotePeerType == RemotePeer.RemotePeerTypes.Master) //{ RemotePeer tmp = itr.Current; if (tmp.GetConnectionStatus() == RemotePeer.ConnectonStaus.Disconnected) { if (tmp.RemotePeerType == RemotePeer.RemotePeerTypes.Master) { Console.WriteLine("Disc 1"); // TODO Reconnect tmp.ConnectionStatusChange(RemotePeer.ConnectonStaus.Disconnected); Disconnect(); Connect(tmp.ipEndPoint.Address.ToString(), tmp.ipEndPoint.Port); Console.WriteLine("Disc 2"); } else { //TODO delete the peer Console.WriteLine("Disc 3"); tmp.ConnectionStatusChange(RemotePeer.ConnectonStaus.Disconnected); // TODO: Why?! //RemotePeerList.Remove(tmp); itr.Current.shouldberemoved = true; Console.WriteLine("Disc 4"); } } else { if ((tmp.RemotePeerType == RemotePeer.RemotePeerTypes.Master) && (tmp.GetConnectionStatus() == RemotePeer.ConnectonStaus.Connected)) { tmp.Ping(); } } //} } List <RemotePeer> RemotePeerListCopys = RemotePeerList; var itrremove = RemotePeerListCopys.ToArray().GetEnumerator(); while (itrremove.MoveNext()) { RemotePeer tmp = (RemotePeer)itrremove.Current; if (tmp.shouldberemoved) { RemotePeerList.Remove(tmp); } } }
public RemotePeer CreateRemotePeer(IPEndPoint remotePeerEndPoint) { RemotePeer rp = new RemotePeer(); rp.ipEndPoint = remotePeerEndPoint; rp.OnConnectionStatusChange += OnConnectionStatusChange; rp.OnMessageReceive += OnMessageReceive; RemotePeerList.Add(rp); Console.WriteLine("RUDPPeer: RemotePeer Created: " + remotePeerEndPoint.Address.ToString() + ":" + remotePeerEndPoint.Port); return(rp); }
private void DispatchInternal(RemotePeer senderpeer, Protocol message) { if (message.Data.Data == "Hello") { Protocol msg = new Protocol(); msg.Header.SendType = ProtocolHeader.MessageSendType.Internal; msg.Data.Data = "HandShake"; Send(senderpeer, msg); senderpeer.ConnectionStatusChange(RemotePeer.ConnectonStaus.Connected); } if (message.Data.Data == "HandShake") { senderpeer.ConnectionStatusChange(RemotePeer.ConnectonStaus.Connected); } }
private void DispatchPing(RemotePeer senderpeer, Protocol message) { if (message.Data.Data == "Ping") { Console.WriteLine("ping received: " + message.Header.SequenceNumber); Protocol msg = new Protocol(); msg.Header.SendType = ProtocolHeader.MessageSendType.Ping; msg.Data.Data = "Pong"; Send(senderpeer, msg); } if (message.Data.Data == "Pong") { Console.WriteLine("pong received: " + message.Header.SequenceNumber); } }
private void RealSend(RemotePeer remotepeer, Protocol message) { int Now = System.Environment.TickCount & Int32.MaxValue; message.SentTime = Now; message.Header.ExternalAckList = remotepeer.GetExternalIncommingMessageSequences(message.Header.SequenceNumber); message.Header.InternalAckList = remotepeer.GetInternalIncommingMessageSequences(message.Header.SequenceNumber); if (message.Header.SendType == ProtocolHeader.MessageSendType.Internal) { remotepeer.LastInternalSendTime = System.Environment.TickCount & Int32.MaxValue; } byte[] tosendbuffer = message.SerializeToBytes(); Console.WriteLine("RUDPPeer: RealSend: " + message.Header.SequenceNumber + ":" + message.Data.Data); int e = socket.SendTo(tosendbuffer, remotepeer.ipEndPoint); message.Sent++; }
private void Dispatch(RemotePeer senderpeer, Protocol message) { if (message.Header.SendType == ProtocolHeader.MessageSendType.Internal) { DispatchInternal(senderpeer, message); } if ((message.Header.SendType == ProtocolHeader.MessageSendType.Ping) && (senderpeer.connectionStatus == RemotePeer.ConnectonStaus.Connected)) { DispatchPing(senderpeer, message); } if ((message.Header.SendType == ProtocolHeader.MessageSendType.External) && (senderpeer.connectionStatus == RemotePeer.ConnectonStaus.Connected)) { OnMessageReceive(message.Data.Data); } message.Dispatched++; senderpeer.LastDispatchedMessage = message.Header.SequenceNumber; }
private int Send(RemotePeer remotepeer, Protocol message) { int messagenumber = remotepeer.AddMessageToOutGoings(message); return(messagenumber); }