Quickfix / n - 没有连接超时或未找到主机的事件?

时间:2017-06-03 15:11:42

标签: c# sockets quickfix quickfixn

所以我有一个项目,我需要在失败的情况下在两个FIX引用主机之间创建故障转移。

FixApplication(IApplication)OnLogout()很好地将事件挂钩到删除套接字或注销时。这很简单。但这只有在套接字连接成功启动时才有效。

如果启动应用程序并且主机已关闭,则实际上不会在任何地方调用此方法。不在IApplication中,也不在socket IInitiator中。任何地方都不会抛出任何错误,QuickFix启动器只是默默地重试。

我正在使用带回调的Timer来经常轮询并检查Initiator IsLoggedOn()是否为false。然后触发故障转移。

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

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

谢谢!

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

1 个答案:

答案 0 :(得分:1)

好吧,在意识到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;
}