私はデータを処理するためにidTCPServerを使用しています。 新しいデバイスの場合、ソケットをdll(そのソケットから読み取るためにtcpサーバーを停止する)に引き渡す必要があります。TCPサーバー:ハンドオーバーソケット接続
IndyまたはICSで可能ですか?
[編集] ハードウェアの不足のため、テスト目的のために、DLLを使用する代わりにスレッドを作成しました。
procedure TfrmIndyMain.IdTCPServer1Connect(AContext: TIdContext);
begin
FMyThread := TMyThread.Create(true);
FMyThread.FSocket := AContext.Binding.Handle;
FMyThread.Resume;
end;
procedure TfrmTest.IdTCPServer1Execute(AContext: TIdContext);
begin
// Its necessary that indy stop reading from the socket, without reset a lot of messages is lost
AContext.Binding.Reset(false); //not sure if this is correct
end;
procedure TMyThread.Execute;
var
len: integer;
data: string;
begin
ioctlsocket(FSocket, FIONREAD, len);
if len>0 then
begin
Setlength(data, len);
if recv(FSocket, pointer(data)^, len, 0) <> SOCKET_ERROR then
Log('Data: ' + data)
else
Log('Error');
end;
end;
Remy、私は質問を更新しました。時々データがありません.... –
アップデートありがとうございます。おそらく私の質問は十分に明確ではなかったが、1つのタイプのデバイスではdllがソケットを処理しています。その場合、私はindyにソケットの読み込みを止めさせたいと思っています(何らかの「手を離してください」または「dllに渡す」)。 dllはソケットが必要な第三者のライブラリです。私のテストコードを別のスレッドに移動し、OnExecuteの無限ループの結果、すべてのメッセージが読み込まれます。またはAContext.Binding.Reset(false);それが正しい方法であるかどうかはわかりません。 –