CSharpRTMP.Core.Protocols.Rtmfp.InboundRTMFPProtocol.PerformHandshake C# (CSharp) Method

PerformHandshake() public method

public PerformHandshake ( byte tag, H2NBinaryWriter response, IPEndPoint address, byte peerIdWanted ) : byte
tag byte
response CSharpRTMP.Common.H2NBinaryWriter
address System.Net.IPEndPoint
peerIdWanted byte
return byte
        public override byte PerformHandshake(byte[] tag, H2NBinaryWriter response, IPEndPoint address, byte[] peerIdWanted)
        {
            var peerIdWantedStr = peerIdWanted.BytesToString();
            var sessionWanted = Sessions.Values.SingleOrDefault(x => x.Peer.IdStr == peerIdWantedStr);
            if (_pCirrus != null)
            {
                var session = Sessions.Values.SingleOrDefault(x => x.Peer.Address.Equals(address));
                if (session == null)
                {
                    FATAL("UDP Hole punching error : middle equivalence not found for session wanted");
                    return 0;
                }
                var request = (session as Middle).Handshaker;
                request.Write((byte)0x22);
                request.Write((byte)0x21);
                request.Write((byte)0x0F);
                request.Write(sessionWanted == null ? peerIdWanted : (session as Middle).Peer.Id, 0, 0x20);
                request.Write(tag);
                return 0;
            }
            if (sessionWanted == null)
            {
                Debug("UDP Hole punching : session {0} wanted not found", peerIdWantedStr);
                var addresses = new List<IPEndPoint>();
                if (addresses.Count == 0) return 0;
                var first = true;
                foreach (var _address in addresses)
                {
                    response.WriteAddress(_address, first);
                    first = false;
                }
                return 0x71;
            }
            if (sessionWanted.Failed())
            {
                Debug("UDP Hole punching : session wanted is deleting");
                return 0;
            }
            byte result = 0x00;
            if (_middle)
            {
                if (sessionWanted.Target != null)
                {
                    var attempt = HandShakeSession.GetHelloAttempt<HelloAttempt>(tag.BytesToString());
                    attempt.Target = sessionWanted.Target;
                    HandShakeSession.CreateCookie(response, attempt, tag, "");
                    response.Write(sessionWanted.Target.PublicKey);
                    result = 0x70;
                }
                else
                {
                    FATAL("Peer/peer dumped exchange impossible : no corresponding 'Target' with the session wanted");
                }
            }
            if (result == 0x00)
            {
                /// Udp hole punching normal process
                var times = sessionWanted.GetHelloAttempt<Attempt>(tag.BytesToString()).Count;
                sessionWanted.P2PHandshake(address, tag, times, (times > 0 || address.Address.Equals(sessionWanted.Peer.Address.Address)) ? Sessions.Values.SingleOrDefault(x => x.Peer.Address.Equals(address)) : null);
                var first = true;
                foreach (var ipEndPoint in sessionWanted.Peer.Addresses)
                {
                    if (ipEndPoint.Equals(address))
                        WARN("A client tries to connect to himself (same {0} address)", address);
                    response.WriteAddress(ipEndPoint, first);
                    Debug("P2P address initiator exchange, {0}:{1}", ipEndPoint.Address, ipEndPoint.Port);
                    first = false;
                }
                result = 0x71;
            }
            return result;
        }