Nun muss ich vom Client(MT4,Mql4) >>> mittels DLL (Lazarus) >>> Server(Lazarus) folgendes senden:
(A) IN ECHTZEIT >>> Timer(1sec) >>> kurze Strings max. 100 zeichen >>> "XYZZZZ|11.21321|23.23232|23.232"
Und das geht auch, damit hab ich kein Problem.
(B) WENN ANGEFORDERT >>> SERVER >>> GET_DATA_XYZ >>> double array[][]/Structur/PackedRecord
siehe http://www.mql5.com/en/docs/constants/s ... s/mqlrates
Code: Alles auswählen
struct MqlRates
{
datetime time; // Period start time
double open; // Open price
double high; // The highest price of the period
double low; // The lowest price of the period
double close; // Close price
long tick_volume; // Tick volume
int spread; // Spread
long real_volume; // Trade volume
};
Ich hab mir bei LNet alles durchgelesen, hier im Forum hab ich alles über LNet gelesen, so richtig sicher bin ich mir jetzt nicht wie es richtig is, manche warten auf OnCanSend, andere prüfen nur die Rückgabe von SendMessage=0 ???
Code: Alles auswählen
{
///////////////////////////////////////////////////////////////////////////////////////////////////////
http://lnet.wordpress.com/usage/sockets-protocols-and-sending/
}
procedure TMyClass.OnCanSend(aSocket: TLSocket);
var
Sent: Integer; // number of bytes sent each try
TempBuffer: string = ''; // our local temp. buffer for the filestream, can be done smarter tho
begin
repeat
if Length(TempBuffer) = 0 thenTempBuffer := GetNewChunk; // get next chunk if we sent all from the last one
Sent := FConnection.SendMessage(TempBuffer, aSocket); // remember, don't use the aSocket directly!
Delete(TempBuffer, 1, Sent); // delete all we sent from our temporary buffer!
until (Sent = 0) or (AllIsSent); // try to send until you can't send anymore
end;
{
///////////////////////////////////////////////////////////////////////////////////////////////////////
http://www.lazarusforum.de/viewtopic.php?p=29832#p29832
}
var data: string;
function GetNewChunk: string;
begin
result := copy(data, 1, 65535);
delete(data, 1, 65535);
end;
{
Ich starte also den ersten Sendevorgang wie gewohnt nur jetzt mit GetNewChunk, wenn mein String 10 Zeichen hat geht der so durch, OnCanSend (feuert nur wenn der Puffer mal am Anschlag war?) macht dann eben nichts. Kommt dann aber ein Array oder ein Stream > 65535 wird der zerschnitten und die Daten geteilt versendet?
(1) Denke mal so sollte es korrekt sein oder?
(2) Die Daten kommen ja in der dll (Lazarus/Client) im Klartext an, als Array oder String. Welches Format ist geeignet?
Ich würde TFileStream nehmen, http://www.delphi-treff.de/tipps-tricks ... speichern/ ???
procedure SaveArray(const AFilename: string; const AArrayData: TArrayData);
procedure LoadArray(const AFilename: string; var AArrayData: TArrayData);
(3) Was passiert in der Zeit mit (A) den Daten die in Echtzeit übertragen werden sollten? Ich gehe davon aus das die Verbindung schnell ist, ist TCP localhost so schnell wie die HDD? Wäre es sinnvoller einen 2 Client über einen anderen Port oder 2 Client / 2 Server einzurichten für die Übertragung von grossen Datensätzen oder geht das gleichzeitig irgendwie über einen Kanal?
Vielen lieben Dank und sorry für den langen Text
