1

我有一个 indy 组件:

IdMappedPortTCP1: TIdMappedPortTCP;

和以下初始化:

procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Lines.Clear;
  IdMappedPortTCP1.MappedHost := '189.200.10.71';
  IdMappedPortTCP1.MappedPort := 5300;
  IdMappedPortTCP1.Active := true;
end;

procedure TForm1.IdMappedPortTCP1Execute(AContext: TIdContext);
begin
  Memo1.Lines.Add(AContext.Data.ToString);
  Memo1.Lines.Add('------');
end;

procedure TForm1.IdMappedPortTCP1OutboundData(AContext: TIdContext);
begin
  Memo1.Lines.Add(AContext.Data.ToString);
  Memo1.Lines.Add('+++++++'); //
end;

我的其他应用程序连接到 189.200.10.71:5300 但组件没有触发...

我的错在哪里?

将 XE3 与包含 indy 组件一起使用

4

1 回答 1

3

一旦客户端连接到它,这些MappedHost/MappedPort属性就会告诉TIdMappedPortTCP它连接到哪里。您正在告诉TIdMappedPortTCP连接到189.200.10.71:5300. 如果您的其他应用程序也正在连接,189.200.10.71:5300则它完全绕过TIdMappedPortTCP。这就解释了为什么事件没有触发(顺便说一句,TIdMappedPortTCP是一个多线程组件,但您的事件处理程序不是线程安全的)。

要通过TIdMappedPortTCP,客户端需要连接到TIdMappedPortTCP.Bindings集合正在侦听的 IP/端口,而不是分配给MappedHost/MappedPort属性的 IP/端口。

于 2012-10-19T02:35:51.410 回答