Конференция "Сети" » Порт-Маппер на Delphi 10 (Turbo) [WinXP]
 
  • XeON © (02.11.08 12:43) [0]
    Доброго времени суток. Возникла задача: написать порт-маппер (с 0-я) на Delphi 10 (Turbo). Использую старые добрые TServerSocket/TClientSocket (которые были в Delphi6). Для тестированя приложения использую Oper'у с настройками прокси на 127.0.0.1 и порт 80. На этом же порте работает TServerSocket. Если устанавливаю его в режим блокировки (stThreadBlocking) - программа наглухо завсает, не помогает ничего! Если ставлю его в асинхоронный режим, то браузер присоеденяется к нему, и буфер для чтения почему-то пустой. Т.е. данныйе он якобы передает, только почему-то не в буфер не в строчный буфер они не поступают...

    Реализация вопроса:
    var buf: array [0..63] of Char;

    procedure TForm1.srv1ClientWrite(Sender: TObject; Socket: TCustomWinSocket);
    begin
    Application.ProcessMessages;
    Socket.ReceiveBuf(buf,64);
    ShowMessage(buf);
    end;

    Итог - в буфере пусто. ReceiveText - дает аналогичный результат!
  • Сергей М. © (02.11.08 21:31) [1]
    Событие OnClientWrite возникает совсем по другому поводу - оно нужно при передаче, а не при приеме.

    Для приема следует обрабатывать OnClientRead.
  • Eraser © (03.11.08 01:31) [2]
    > [0] XeON ©   (02.11.08 12:43)

    вот на Indy
       // Организуем Port Mapping.
       OutboundClient := TIdTCPClient.Create(Self);
       try
         OutboundClient.Host := slLine[1];
         OutboundClient.Port := StrToInt(slLine[2]);
         OutboundClient.ConnectTimeout := DEFAULT_CONNECTION_TIMEOUT;
         OutboundClient.ReadTimeout := DEFAULT_READ_TIMEOUT;
         // Соединяемся.
         OutboundClient.Connect;
         OutboundClient.Socket.UseNagle := False;
         // Отсылаем данные о соединении.
         // Версия протокола.
         OutboundClient.IOHandler.Write(Integer(ROM_PROTOCOL_VERSION));
         // Оповещаем сервер о том, что используем каскадное соединение.
         OutboundClient.IOHandler.Write(Integer(CASCADE_CONNECT));
         // Отсылаем маршрут (список) соединенй.
         OutboundClient.IOHandler.Write(Integer(ms.Size));
         OutboundClient.IOHandler.Write(ms, ms.Size);
         // Механизм Port Mapping'а.
         while AContext.Connection.Connected do
         begin
           AContext.Connection.IOHandler.CheckForDataOnSource(1);
           FNetData := AnsiString(AContext.Connection.IOHandler.InputBufferAsString);
           if Length(FNetData) > 0 then
           begin
             OutboundClient.IOHandler.Write(string(FNetData));
           end;
           OutboundClient.IOHandler.CheckForDataOnSource(1);
           //OutboundClient.IOHandler.InputBuffer.
           FNetData := AnsiString(OutboundClient.IOHandler.InputBufferAsString);
           if Length(FNetData) > 0 then
           begin
             AContext.Connection.IOHandler.Write(string(FNetData));
           end;
         end;
       finally
         OutboundClient.Free;
       end;

  • XeON © (03.11.08 11:00) [3]
    Сергей М., СПАСИБО и РЕСПЕКТ! Помог балбесу! :) Теперь всё работает на ура! Супер! Тему думаю, можно закрыть...
 
Конференция "Сети" » Порт-Маппер на Delphi 10 (Turbo) [WinXP]
Есть новые Нет новых   [134470   +16][b:0][p:0.003]