[Quickfix-developers] please help with Socket[both].... under VB.NET
Brought to you by:
orenmnero
|
From: Bogdan C. <fxe...@ya...> - 2007-02-04 16:42:04
|
[I too am complete newbie to FIX ... all I know is MetaTrader...]
I started to unravel the quickfix mysteries starting from the Executor app.
Was kinda dumb at that time and I didn't understand how to make the settings file, so I was forced to learn how to make config manually.
I thought things would be simpler with a container class, which was supposed to easily handle the config.
so here it goes:
Option Explicit On
Imports System
Imports System.Globalization
Imports QuickFix
Module FastFix
Public Const FIX44 As String = "FIX.4.4"
Public Const FIX43 As String = "FIX.4.3"
Public Const FIX42 As String = "FIX.4.2"
Public Const FIX41 As String = "FIX.4.1"
Public Const FIX40 As String = "FIX.4.0"
Public Const Initiator As String = "initiator"
Public Const Acceptor As String = "acceptor"
Public Class FixContainer
Public fixConnectionType As String
Public fixSessionID As SessionID
Public fixDictionary As New Dictionary
Public fixDataDictionary As New DataDictionary
Public fixSessionSettings As SessionSettings
Public fixApplication As New Application
Public fixFileStoreFactory As FileStoreFactory
Public fixFileLogFactory As FileLogFactory
Public fixMessageFactory As New DefaultMessageFactory
Public fixSocketAcceptor As SocketAcceptor
Public fixSocketInitiator As SocketInitiator
Public Sub New(ByVal BaseURL As String, _
ByVal BeginString As String, _
ByVal SenderCompID As String, _
ByVal TargetCompID As String, _
ByVal SessionQualifier As String, _
ByVal ConnectionType As String, _
ByVal SocketPort As Integer, _
ByVal SocketHost As String, _
Optional ByVal StartTime As String = "", _
Optional ByVal EndTime As String = "", _
Optional ByVal StartDay As String = "", _
Optional ByVal EndDay As String = "", _
Optional ByVal MillisecondsInTimeStamp As String = "Y", _
Optional ByVal SendRedundantResendRequests As String = "N", _
Optional ByVal ResetOnLogon As String = "N", _
Optional ByVal ResetOnLogout As String = "N", _
Optional ByVal ResetOnDisconnect As String = "N", _
Optional ByVal RefreshOnLogon As String = "N", _
Optional ByVal HeartBtInt As Integer = 30)
fixConnectionType = ConnectionType
Try
'ID keys
Dim NowDateStart, NowDateEnd As DateTime
Dim FullURL As String = BaseURL
Dim FixFile As String = ""
fixSessionID = New SessionID(BeginString, SenderCompID, TargetCompID, SessionQualifier)
Select Case BeginString
Case "FIX.4.0"
FixFile = "FIX40.XML"
Case "FIX.4.1"
FixFile = "FIX41.XML"
Case "FIX.4.2"
FixFile = "FIX42.XML"
Case "FIX.4.3"
FixFile = "FIX43.XML"
Case "FIX.4.4"
FixFile = "FIX44.XML"
End Select
FullURL = BaseURL + FixFile
fixDataDictionary = New DataDictionary(FullURL)
fixDictionary.setString("BeginString", BeginString)
fixDictionary.setString("SenderCompID", SenderCompID)
fixDictionary.setString("TargetCompID", TargetCompID)
If fixConnectionType = "initiator" Then
fixDictionary.setString("SessionQualifier", SessionQualifier)
End If
fixDictionary.setString("ConnectionType", ConnectionType)
NowDateStart = DateTime.UtcNow
NowDateEnd = NowDateStart.AddDays(7)
If Len(StartTime) <> 0 Then
fixDictionary.setString("StartTime", StartTime)
Else
fixDictionary.setString("StartTime", NowDateStart.ToString("T", DateTimeFormatInfo.InvariantInfo))
End If
If Len(EndTime) <> 0 Then
fixDictionary.setString("EndTime", EndTime)
Else
fixDictionary.setString("EndTime", NowDateEnd.ToString("T", DateTimeFormatInfo.InvariantInfo))
End If
If Len(StartDay) <> 0 Then
fixDictionary.setString("StartDay", StartDay)
Else
fixDictionary.setString("StartDay", NowDateStart.DayOfWeek)
End If
If Len(EndDay) <> 0 Then
fixDictionary.setString("EndDay", EndDay)
Else
fixDictionary.setString("EndDay", NowDateEnd.DayOfWeek)
End If
fixDictionary.setString("MillisecondsInTimeStamp", MillisecondsInTimeStamp)
fixDictionary.setString("SendRedundantResendRequests", SendRedundantResendRequests)
fixDictionary.setString("ResetOnLogon", ResetOnLogon)
fixDictionary.setString("ResetOnLogout", ResetOnLogout)
fixDictionary.setString("ResetOnDisconnect", ResetOnDisconnect)
fixDictionary.setString("ResetOnLogon", RefreshOnLogon)
'Validation keys
fixDictionary.setString("UseDataDictionary", "Y")
fixDictionary.setString("DataDictionary", FullURL)
'Initiator and acceptor keys
fixDictionary.setLong("HeartBtInt", HeartBtInt)
If fixConnectionType = "initiator" Then
fixDictionary.setLong("SocketConnectPort", SocketPort)
fixDictionary.setString("SocketConnectHost", SocketHost)
End If
If fixConnectionType = "acceptor" Then
fixDictionary.setLong("SocketAcceptPort", SocketPort)
End If
'Building settings
fixSessionSettings = New SessionSettings
fixSessionSettings.set(fixSessionID, fixDictionary)
fixFileStoreFactory = New FileStoreFactory("c:\quickfixmsgs")
fixFileLogFactory = New FileLogFactory("c:\quickfixmsgs")
fixDataDictionary = New DataDictionary(FullURL)
'Building Session
'at FIX.SocketInitiator.{ctor}(SocketInitiator* , Application* , MessageStoreFactory* , SessionSettings* , LogFactory* )
If fixConnectionType = "initiator" Then
'error goes here
fixSocketInitiator = New SocketInitiator(fixApplication, fixFileStoreFactory, fixSessionSettings, fixFileLogFactory, fixMessageFactory)
End If
If fixConnectionType = "acceptor" Then
'and here
fixSocketAcceptor = New SocketAcceptor(fixApplication, fixFileStoreFactory, fixSessionSettings, fixFileLogFactory, fixMessageFactory)
End If
Console.WriteLine("Session existence status : " + CStr(Session.doesSessionExist(fixSessionID)))
Catch e As System.Exception
Console.WriteLine(e)
Console.ReadKey()
End Try
End Sub
Sub Login()
If fixConnectionType = "initiator" Then
fixSocketInitiator.start()
End If
If fixConnectionType = "acceptor" Then
fixSocketAcceptor.start()
End If
End Sub
Sub Logoff()
If fixConnectionType = "initiator" Then
fixSocketInitiator.stop()
End If
If fixConnectionType = "acceptor" Then
fixSocketAcceptor.stop()
End If
End Sub
End Class
End Module
I left the Application.vb module intact as it was in Executor, and initiated configuration from the main module:
Dim Fixc As New FixContainer("file:///F:/Trading%20Platform%20Kits/QuickFIX%20engine/quickfix/spec/", FIX41, "TW", "ARCA", "Fixc", Initiator, 9823, "123.123.123.123")
what i get is this:
System.AccessViolationException: Attempted to read or write protected memory. Th
is is often an indication that other memory is corrupt.
at FIX.SocketInitiator.{ctor}(SocketInitiator* , Application* , MessageStoreF
actory* , SessionSettings* , LogFactory* )
at QuickFix.SocketInitiator..ctor(Application application, MessageStoreFactor
y factory, SessionSettings settings, LogFactory logFactory, MessageFactory messa
geFactory)
[....]
Now I'm totally lost.
P.S.
1.If i set connection type to Acceptor, i get the same error, generated by New SocketAcceptor
2.I also have doubts about the FileStoreFactory and FileLogFactory, because the New requests a path and in the example the New is applied to settings...
Did anyone confront with this issue?
---------------------------------
Need Mail bonding?
Go to the Yahoo! Mail Q&A for great tips from Yahoo! Answers users. |