예제 #1
0
        public void ConnectTURN(string address, bool isFirst)
        {
            if (address == null || address.Length == 0)
            {
                address = turnDefaultAddress;
            }

            turnHost = protocol.GenerateHostAddressAndPort(address, turnDefaultPort);

            MessageSTUN message = protocol.Create <MessageSTUN>();

            message.method        = STUNMethod.AllocateRequest;
            message.transactionID = transactionID;

            //message.WriteString(STUNAttribute.ServerName, "Coturn-4.5.1.1 'dan Eider'");
            message.WriteUInt(STUNAttribute.Lifetime, 300);
            message.WriteUInt(STUNAttribute.RequestedTransport, (uint)(17 << 24));
            message.WriteEmpty(STUNAttribute.DontFragment);
            message.WriteString(STUNAttribute.Username, message.username);
            message.WriteString(STUNAttribute.Realm, message.realm);

            if (nonce != null)
            {
                message.WriteBytes(STUNAttribute.Nonce, nonce);
                message.WriteRequestIntegrity();
            }


            Console.WriteLine("TURN Method: " + Enum.GetName(typeof(STUNMethod), message.method) + " (" + ((int)message.method).ToString("X") + ")");
            Console.WriteLine("TURN Request sent to: " + turnHost.ToString());

            protocol.SendSTUN(turnHost, message, 3000);
        }
예제 #2
0
        public string GetAttributeKeys(MessageSTUN message)
        {
            string attrKeys = "";

            foreach (KeyValuePair <STUNAttribute, object> entry in message.response)
            {
                string key = Enum.GetName(typeof(STUNAttribute), entry.Key);
                int    id  = (int)entry.Key;
                if (attrKeys.Length > 0)
                {
                    attrKeys += "\n";
                }
                object value    = entry.Value;
                string valueStr = "";
                if (value is string v)
                {
                    valueStr = v;
                }
                else if (value is byte[] b)
                {
                    valueStr = NetworkSerializer.ByteArrayToHexString(b);
                }
                else
                {
                    valueStr = value.ToString();
                }
                attrKeys += key + "(" + id.ToString("X") + ") = " + valueStr;
            }
            return(attrKeys);
        }
예제 #3
0
        public void OnError(object sender, NetworkPacket packet)
        {
            MessageSTUN message = (MessageSTUN)packet.messages[0];

            if (message.method == STUNMethod.BindingRequest)
            {
                OnErrorBindingRequest();
            }
        }
예제 #4
0
        public void ConnectSTUN(string address, bool changeIP, bool changePort)
        {
            stunHost = protocol.GenerateHostAddressAndPort(address, stunDefaultPort);

            MessageSTUN message = protocol.Create <MessageSTUN>();

            message.method        = STUNMethod.BindingRequest;
            message.transactionID = transactionID;
            message.WriteChangeRequest(changeIP, changePort);

            Console.WriteLine("Sending STUN Request to: " + stunHost.ToString());
            protocol.SendSTUN(stunHost, message, NetworkConfig.SocketReliableRetryDelay);
        }
예제 #5
0
        public void OnBindingResponse(NetworkPacket packet, MessageSTUN message)
        {
            if (testId > -1)
            {
                Console.WriteLine("STUN Test #" + testId);

                changedAddress = message.GetString(STUNAttribute.ChangedAddress);
                mappedAddress  = message.GetString(STUNAttribute.MappedAddress);
                sourceAddress  = message.GetString(STUNAttribute.SourceAddress);

                CheckTests(true);
            }
            else
            {
            }
        }
예제 #6
0
        public void OnResponse(object sender, NetworkMessage msg)
        {
            NetworkPacket packet  = (NetworkPacket)sender;
            MessageSTUN   message = (MessageSTUN)msg;

            Console.WriteLine("STUN Host: " + packet.remoteEndPoint.ToString());
            Console.WriteLine("STUN Response Method: " + Enum.GetName(typeof(STUNMethod), message.method));
            //Console.WriteLine("STUN Response Length: " + methodLength);
            Console.WriteLine("STUN Attributes: \n" + GetAttributeKeys(message));

            switch (message.method)
            {
            case STUNMethod.BindingResponse:
                OnBindingResponse(packet, message);
                break;

            case STUNMethod.AllocateError:
                OnAllocateError(packet, message);
                break;
            }
        }
예제 #7
0
 public void OnAllocateError(NetworkPacket packet, MessageSTUN message)
 {
     nonce = (byte[])message.Get(STUNAttribute.Nonce);
     ConnectTURN(null, false);
 }