예제 #1
0
        internal void SendMessage <T>(MessageType mt, T message)
        {
            lock (_ssl)
            {
                if (mt != MessageType.Ping && mt != MessageType.UDPTunnel)
                {
                    Debug.Log("Sending " + mt + " message");
                }
                //_writer.Write(IPAddress.HostToNetworkOrder((Int16) mt));
                //Serializer.SerializeWithLengthPrefix(_ssl, message, PrefixStyle.Fixed32BigEndian);
                Int16 messageType = (Int16)mt;

                // UDP Tunnels have their own way in which they handle serialization
                if (mt == MessageType.UDPTunnel)
                {
                    UDPTunnel udpTunnel   = message as UDPTunnel;
                    Int32     messageSize = (Int32)udpTunnel.packet.Length;
                    _writer.Write(IPAddress.HostToNetworkOrder(messageType));
                    _writer.Write(IPAddress.HostToNetworkOrder(messageSize));
                    _writer.Write(udpTunnel.packet);
                }
                else
                {
                    MemoryStream messageStream = new MemoryStream();
                    Serializer.NonGeneric.Serialize(messageStream, message);
                    Int32 messageSize = (Int32)messageStream.Length;
                    _writer.Write(IPAddress.HostToNetworkOrder(messageType));
                    _writer.Write(IPAddress.HostToNetworkOrder(messageSize));
                    messageStream.Position = 0;
                    _writer.Write(messageStream.ToArray());
                }

                /*
                 * StringBuilder sb = new StringBuilder();
                 * byte[] msgArray = messageStream.ToArray();
                 * for (int i = 0; i < msgArray.Length; i++)
                 * {
                 *  sb.Append(msgArray[i]);
                 *  sb.Append(",");
                 * }
                 * Debug.Log(sb.ToString());
                 */
                _writer.Flush();
            }
        }
예제 #2
0
        internal void SendVoicePacket(byte[] voicePacket)
        {
            if (!_isConnected)
            {
                Debug.LogError("Not yet connected");
                return;
            }
            try
            {
                if (_mumbleClient.UseLocalLoopBack)
                {
                    UnpackOpusVoicePacket(voicePacket, true);
                }
                //Debug.Log("Sending UDP packet! Length = " + voicePacket.Length);

                if (_useTcp)
                {
                    //Debug.Log("Using TCP!");
                    UDPTunnel udpMsg = new UDPTunnel
                    {
                        Packet = voicePacket
                    };
                    _tcpConnection.SendMessage(MessageType.UDPTunnel, udpMsg);
                    return;
                }
                else
                {
                    byte[] encrypted = _cryptState.Encrypt(voicePacket, voicePacket.Length);
                    lock (_sendLock)
                    {
                        _udpClient.Send(encrypted, encrypted.Length);
                    }
                }
                NumPacketsSent++;
            }catch (Exception e)
            {
                Debug.LogError("Error sending packet: " + e);
            }
        }
예제 #3
0
        static int Main(string[] args)
        {
            Settings settings = new Settings();

            settings.isServer      = false;
            settings.ipEndpointStr = "minecraft1.52k.de:25560";
            settings.listenPort    = 0;

            int serverCount = 0;

            foreach (string arg in args)
            {
                if (serverCount == 2)
                {
                    settings.ipEndpointStr = arg;
                }
                if (serverCount == 1)
                {
                    settings.listenPort = Int32.Parse(arg);
                }
                if (serverCount > 0)
                {
                    serverCount--;
                    continue;
                }
                if (arg == "--server")
                {
                    settings.isServer = true;
                    serverCount       = 2;
                }
                if (arg == "--ipv6")
                {
                    settings.ipv4only = false;
                    settings.ipv6only = true;
                }
                if (arg == "--ipv4")
                {
                    settings.ipv4only = true;
                    settings.ipv6only = false;
                }
            }

            //ParseIPEndpoint
            string addPart = settings.ipEndpointStr.Substring(0, settings.ipEndpointStr.LastIndexOf(":"));

            //Trim [] parts;
            if (addPart.Contains("["))
            {
                addPart.Substring(1, addPart.Length - 2);
            }
            if (!IPAddress.TryParse(addPart, out IPAddress ipAddr))
            {
                IPAddress[] addrs = null;
                try
                {
                    addrs = Dns.GetHostAddresses(addPart);
                }
                catch (Exception e)
                {
                    Console.WriteLine("DNS error: " + e.Message);
                    return(-1);
                }
                foreach (IPAddress testIP in addrs)
                {
                    if (!settings.ipv4only && !settings.ipv6only)
                    {
                        ipAddr = testIP;
                        break;
                    }
                    if (settings.ipv4only && testIP.AddressFamily == AddressFamily.InterNetwork)
                    {
                        ipAddr = testIP;
                        break;
                    }
                    if (settings.ipv6only && testIP.AddressFamily == AddressFamily.InterNetworkV6)
                    {
                        ipAddr = testIP;
                        break;
                    }
                }
            }

            if (ipAddr == null)
            {
                Console.WriteLine("DNS returned no usable results");
                return(-2);
            }

            string portPart = settings.ipEndpointStr.Substring(settings.ipEndpointStr.LastIndexOf(":") + 1);

            settings.ipEndpoint = new IPEndPoint(ipAddr, Int32.Parse(portPart));

            if (settings.listenPort == 0)
            {
                settings.listenPort = Int32.Parse(portPart);
            }

            //Init
            running = true;
            NetworkHandler networkHandler = new NetworkHandler();
            UDPTunnel      udpt           = new UDPTunnel(networkHandler, settings);

            if (settings.isServer)
            {
                TunnelServer ts = new TunnelServer(networkHandler, settings);
                Console.WriteLine("Press Ctrl+C key to quit");
                Console.CancelKeyPress += (object sender, ConsoleCancelEventArgs e) =>
                {
                    running = false;
                    ts.Shutdown();
                    udpt.Shutdown();
                };
                DisplayMain(networkHandler);
            }
            else
            {
                TunnelClient tc = new TunnelClient(networkHandler, settings);
                Console.WriteLine("Press Ctrl+C to quit");
                Console.CancelKeyPress += (object sender, ConsoleCancelEventArgs e) =>
                {
                    running = false;
                    tc.Shutdown();
                    udpt.Shutdown();
                };
                DisplayMain(networkHandler);
            }
            return(0);
        }
예제 #4
0
파일: UDPServer.cs 프로젝트: URK96/GFVPN
 public void cleanUp(UDPTunnel udpTunnel)
 {
     udpTunnel.close();
 }