1

所以我有一个项目,我需要在两个 FIX 报价主机之间创建故障转移,以防发生故障。

FixApplication (IApplication) OnLogout() 可以很好地将事件挂钩到套接字被丢弃或您注销时。这很简单。但这仅在套接字连接成功启动时才有效。

如果您启动应用程序并且主机已关闭,则实际上不会在任何地方为此调用任何方法。不在 IApplication 中,也不在套接字 IInitiator 中。也不会在任何地方引发错误,QuickFix 启动器只会静默重试。

我现在正在使用带有回调的计时器来经常手动轮询并检查 Initiator IsLoggedOn() 是否为假。然后触发故障转移。

但这真的很笨重而且不优雅。

在网络连接和会话成功建立之前,是否有任何其他事件或方法可以挂钩以接收套接字网络故障的通知?

谢谢!

Timer t = new Timer(5000) 
t.Elapsed += CheckSocketConnected;
private void CheckSocketConnected(object source, ElapsedEventArgs e)
{
     var connected = socketInitiator.IsLoggedOn;
     if (!connected)
     {
         SwitchToAlternateProvider();
     }
}
4

1 回答 1

2

好吧,在意识到 QuickFix/N 组件的局限性之后,如果主机宕机,我将永远不会收到该库的任何反馈。

我的解决方案是在 QuickFix/n 中启动连接之前简单地使用以下代码检查套接字是否打开

bool IsPortOpen(string host, int port, TimeSpan timeout)
{
    try
    {
        using(var client = new TcpClient())
        {
            var result = client.BeginConnect(host, port, null, null);
            var success = result.AsyncWaitHandle.WaitOne(timeout);
            if (!success)
            {
                return false;
            }

            client.EndConnect(result);
        }

    }
    catch
    {
        return false;
    }
    return true;
}
于 2017-09-24T10:13:15.307 回答