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(); } }
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++; }
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); }