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); }
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); }
public void OnError(object sender, NetworkPacket packet) { MessageSTUN message = (MessageSTUN)packet.messages[0]; if (message.method == STUNMethod.BindingRequest) { OnErrorBindingRequest(); } }
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); }
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 { } }
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; } }
public void OnAllocateError(NetworkPacket packet, MessageSTUN message) { nonce = (byte[])message.Get(STUNAttribute.Nonce); ConnectTURN(null, false); }