Indy SSL для простого насоса - PullRequest
       9

Indy SSL для простого насоса

0 голосов
/ 10 октября 2011

Я должен предоставить SSL-интерфейс для простого TCP-сервера, поэтому я делаю «насосное» приложение, которое будет обеспечивать SSL-соединение с внешней стороной, в то время как исходный сервер может оставаться простым.

IЯ пытаюсь использовать компоненты 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 = Серверная сторона (клиентдля TCP-сервера, к которому я пытаюсь добавить SSL).

Теперь я знаю, что он нуждается в очистке, и ожидание в 1 мс не очень красиво, но прежде чем я смогу атаковать эту проблему, я хотел бынекоторые данные.

Ни один из моих ReadBytes не вызывается.Когда я использовал cs.Readable(), я получил true только один раз, но я все еще не мог прочитать.

Что я могу сделать, чтобы сделать насос?Почему я не получаю данные?

1 Ответ

4 голосов
/ 10 октября 2011

Попробуйте использовать компонент TIdMappedPortTCP вместо TIdTCPServer напрямую.TIdMappedPortTCP выполняет всю работу по передаче данных между клиентом и другим сервером.По умолчанию исходящее соединение со вторым сервером не шифруется, даже если зашифрованное входящее соединение с TIdMappedPortTCP.

...