Indy SSL到普通插座泵

时间:2011-10-10 00:03:22

标签: delphi ssl indy

我必须为普通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一次,但我仍然无法阅读。

我该怎么做泵?为什么我没有获取数据?

1 个答案:

答案 0 :(得分:4)

尝试直接使用TIdMappedPortTCP组件而不是TIdTCPServerTIdMappedPortTCP处理在客户端和另一台服务器之间来回传递数据的所有工作。默认情况下,即使与TIdMappedPortTCP的入站连接已加密,也不会加密与第二台服务器的出站连接。