데이터 처리를 위해 idTCPServer를 사용하고 있습니다. 새 장치의 경우 ()을 소켓에 dll (이 소켓에서 읽기 위해 tcp 서버를 중지)로 넘겨 줘야합니다.TCP 서버 : 핸드 오버 소켓 연결
인디 또는 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가 소켓을 읽는 것을 멈추고 싶다. (어떤 종류의 'hand off'또는 'dll에 넘기다'). dll은 소켓이 필요한 제 3 자 라이브러리입니다. 내 테스트 코드를 별도의 스레드로 이동하고 OnExecute의 무한 루프로 인해 모든 메시지를 읽습니다. 또는 AContext.Binding.Reset (false); 그게 올바른 방법인지 확실하지 않습니다. –