我必须为普通TCP服务器提供SSL前端,所以我正在创建一个“泵”应用程序,它将提供与外部的SSL连接,而原始服务器可以保持原状。
我正在尝试使用Indy组件来支持我的SSL需求,但我似乎无法从SSL端口获取任何数据。我将TIdTCPServer.OnExecute分配给以下事件处理程序:
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
c:TIdTCPClient;
cs,ss:TIdIOHandler;
b:TBytes;
begin
c:=TIdTCPClient.Create(Self);
try
c.Host:='127.0.0.1';
c.Port:=60675;
c.ConnectTimeout:=500;
c.Connect;
ss:=c.IOHandler;
cs:=AContext.Connection.IOHandler;
while (cs.Connected) and (ss.Connected) do
begin
if cs.CheckForDataOnSource(1) then
begin
try
cs.ReadBytes(b,1,False);
except on e:Exception do
Memo1.Lines.Add(e.Message); //BAD out of Thread context
end;
if Length(b)>0 then
ss.Write(b);
end;
if ss.CheckForDataOnSource(1) then
begin
ss.ReadBytes(b,1,False);
if Length(b)>0 then
cs.Write(b);
end;
end;
finally
c.Free;
end;
end;
TCP服务器附加了SSL处理程序。我在一个普通的HTTP服务器上做了同样的事情并且工作正常,所以我假设我的SSL设置不是问题。
cs =客户端(服务器套接字)和ss =服务器端(我尝试将SSL添加到TCP服务器的客户端)。
现在,我知道它需要清理并且做1ms的等待并不漂亮,但在我能够解决这个问题之前,我想收到一些数据。
我的ReadBytes都没有被调用。当我使用cs.Readable()
时,我只获得true
一次,但我仍然无法阅读。
我该怎么做泵?为什么我没有获取数据?
答案 0 :(得分:4)
尝试直接使用TIdMappedPortTCP
组件而不是TIdTCPServer
。 TIdMappedPortTCP
处理在客户端和另一台服务器之间来回传递数据的所有工作。默认情况下,即使与TIdMappedPortTCP
的入站连接已加密,也不会加密与第二台服务器的出站连接。