void SendSyn() { RudpPacket syn = new RudpPacket(); lock (SendSection) // ensure queued in right order with right current seq { syn.TargetID = Session.UserID; syn.TargetClient = Session.ClientID; syn.PeerID = 0; syn.PacketType = RudpPacketType.Syn; syn.Sequence = CurrentSeq++; syn.Payload = RudpSyn.Encode(1, Network.Local.UserID, Network.Local.ClientID, PeerID); SendPacketMap.Enqueue(new TrackPacket(syn)); } ManageSendWindow(); }
void ReceiveSyn(RudpPacket packet) { RudpSyn syn = new RudpSyn(packet.Payload); if (RemotePeerID == 0) { RemotePeerID = syn.ConnID; } //Session.Log("Syn Recv, Seq " + packet.Sequence.ToString() + ", ID " + syn.ConnID.ToString()); SendAck(packet); // send ack here also because peerID now set SynAckSent = true; if (SynAckSent && SynAckReceieved) { Session.Log("Connected (recv syn)"); ChangeState(RudpState.Connected); SetConnected(); } }
public void ReceiveCommPacket(G2ReceivedPacket raw, RudpPacket packet) { try { if (packet.PacketType == RudpPacketType.Light || packet.PacketType == RudpPacketType.LightAck) { LightComm.ReceivePacket(raw, packet); return; } // if a socket already set up lock (RudpControl.SocketMap) if (RudpControl.SocketMap.ContainsKey(packet.PeerID)) { RudpControl.SocketMap[packet.PeerID].RudpReceive(raw, packet, IsLookup); return; } // if starting new session if (packet.PacketType != RudpPacketType.Syn) { return; } RudpSyn syn = new RudpSyn(packet.Payload); // prevent connection from self if (syn.SenderID == Local.UserID && syn.ClientID == Local.ClientID) { return; } // find connecting session with same or unknown client id ulong id = syn.SenderID ^ syn.ClientID; if (RudpControl.SessionMap.ContainsKey(id)) { RudpSession session = RudpControl.SessionMap[id]; // if session id zero or matches forward if ((session.Comm.State == RudpState.Connecting && session.Comm.RemotePeerID == 0) || (session.Comm.State != RudpState.Closed && session.Comm.RemotePeerID == syn.ConnID)) // duplicate syn { session.Comm.RudpReceive(raw, packet, IsLookup); return; } else if (session.Comm.State == RudpState.Finishing) { RudpControl.RemoveSession(session); // remove session, allow new one to be created } else { return; } } // if clientid not in session, create new session RudpSession newSession = new RudpSession(RudpControl, syn.SenderID, syn.ClientID, true); RudpControl.SessionMap[id] = newSession; // send ack before sending our own syn (connect) // ack tells remote which address is good so that our syn's ack comes back quickly newSession.Comm.RudpReceive(raw, packet, IsLookup); newSession.Connect(); UpdateLog("RUDP", "Inbound session accepted to ClientID " + syn.ClientID.ToString()); } catch (Exception ex) { UpdateLog("Exception", "DhtNetwork::ReceiveCommPacket: " + ex.Message); } }