示例#1
0
        private void SendHeartbeat(string remoteIp, int remotePort)
        {
            lock (_hbMutex)
            {
                if (_hbMutex.IsHeld())
                {
                    //Logger.Info(string.Format("TunnelId={0} TunnelName={1} Message=\"Heartbeat has already been sent to {2}:{3} in the last {4} seconds. Aborting.\"", GetId(), FriendlyName, remoteIp, remotePort, HeartbeatTimeout / 1000));
                    return;
                }
                Logger.Info(string.Format("TunnelId={0} TunnelName={1} Message=\"Locking available mutex to send heartbeat to remote client {2}:{3}\"", GetId(), FriendlyName, remoteIp, remotePort));
                _hbMutex.Hold();
            }

            var tmpBuffer = Buffer.New();

            Buffer.ClearBuffer(tmpBuffer);
            Buffer.FinalizeBuffer(tmpBuffer);
            SockLib.SendMessage(_socket, remoteIp, remotePort, tmpBuffer);
            Thread.Sleep(HeartbeatTimeout);

            lock (_hbMutex)
            {
                Logger.Info(string.Format("TunnelId={0} TunnelName={1} Message=\"Releasing mutex for heartbeat\"", GetId(), FriendlyName));
                _hbMutex.Release();
            }
        }
示例#2
0
        public Tunnel(IMessageHandler messageHandler, string friendlyName = "Cactus Fantastico", int port = 14804)
        {
            MessageHandler = messageHandler;

            FriendlyName  = friendlyName;
            _socket       = SockLib.UdpConnect(port);
            _messageQueue = new ConcurrentQueue <Message>();
            _hbMutex      = new SimpleMutex();
            _id           = _tunnelCounter++;
        }
示例#3
0
        private void TunnelSendThread(string remoteIp, int remotePort)
        {
            while (true)
            {
                var message = DequeueMessage();
                if (message == null)
                {
                    new Thread(() => SendHeartbeat(remoteIp, remotePort)).Run();
                    continue;
                }

                Buffer.ClearBuffer(_sendBuffer);
                Buffer.Add(_sendBuffer, message);
                Buffer.FinalizeBuffer(_sendBuffer);
                SockLib.SendMessage(_socket, remoteIp, remotePort, _sendBuffer);
            }
        }
        public void MessageReceiveThread()
        {
            var exitFlag = false;

            while (exitFlag == false)
            {
                if (SockLib.BytesAvailable(_recvSocket) > 0)
                {
                    if (SockLib.ReceiveMessage(_recvSocket, _recvBuffer) > 0)
                    {
                        //TODO: Apparently, you cannot get ip and/or port address of a udp socket... need to write values to payload...
                        //var remoteIp = SockLib.GetRemoteIpAddress(_recvSocket);
                        //var remotePort = SockLib.GetRemotePort(_recvSocket);
                        Buffer.FinalizeBuffer(_recvBuffer);
                        MessageRecieved(new KeyValuePair <string, int>("127.0.0.1", 1025), Buffer.GetBuffer(_recvBuffer));
                    }
                }
            }
            //RecvThreadDeathNotification();
        }
        private static Socket CreateSocket()
        {
            const int minPort     = 1025;
            const int maxPort     = 65535;
            var       currentPort = minPort;

            do
            {
                try
                {
                    Logger.DebugFormat("Attempting to bind to local port {0}", currentPort);
                    return(SockLib.UdpConnect(currentPort));
                }
                catch (Exception)
                {
                    Logger.DebugFormat("Failed to bind to port {0}", currentPort);
                    currentPort++;
                }
            } while (currentPort <= maxPort);
            const string message = "Failed to bind to any local ports. Check your firewall.";

            Logger.Error(message);
            throw new IOException(message);
        }