我必须为普通的TCP服务器提供一个SSL前端,所以我正在制作一个“泵”应用程序,它将提供到外部的SSL连接,而原始服务器可以保持原状。Indy 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
一次,但我仍然无法阅读。
我该怎么做一个泵?为什么我没有获取数据?
我想通了我的问题:我的SSL端口工作在PassThrough模式。我不知道我必须自己在OnConnect处理程序中设置它。 – DDS
然后你必须使用Indy 10。在Indy 9和更早的版本中,即使在任何数据交换之前,服务器端SSL IOHandler都会强制所有接受的连接进行加密(PassThrough = False)。这阻止了诸如混合的SSL /非SSL客户端,STARTTLS风格的命令等等。在Indy 10中,服务器端SSL IOHandler现在接受未加密的新连接(PassThrough = True),以便您可以选择哪些客户端使用SSL以及何时使用SSL激活SSL。 –