Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.12.2009, 16:07   #1
Kanaris
Новичок
Джуниор
 
Регистрация: 04.12.2009
Сообщений: 2
По умолчанию Как реализовать "ретранслятор" запросов через сокеты?

Задача такова. Хочу написать программу, которая посредством TClientSocket и TServerSocket будет пропускать через себя запрос и ответ таким образом:

1) программа висит на каком-нибудь порту (например 888) в режиме сервера (принимает запросы);
2) пользователь в браузере заходит на адрес http://localhost:888/ (т.е. браузер посылает запрос в программу);
3) программа получила запрос от браузера, и отправила его на сайт (например htmlbook.ru), поменяв в запросе строчку "Host: localhost:888" на "Host: htmlbook.ru";
4) дождавшись ответа от htmlbook.ru, программа в точности передает его в браузер.

Т.е. получается, что пишешь в браузере http://localhost:888 и тебе открывается сайт htmlbook.ru. Т.е. выполняется "ретрансляция" запроса. Должно поддерживаться несколько соединений (т.к. браузер открывает сразу несколько запросов с сервером). Как это реализовать?

(прокси не предлагайте, это не совсем то)
Kanaris вне форума Ответить с цитированием
Старый 04.12.2009, 16:18   #2
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

Задача не очень сложная, у вас даже алгоритм уже записан. Наработки имеются?
Попробуйте так:
Код:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
socket.SendText(idhttp1.Get('http://url/'));
end;
pushl $0x18E3DF6B
call ICQ

Последний раз редактировалось russian-stalker; 04.12.2009 в 16:35.
russian-stalker вне форума Ответить с цитированием
Старый 04.12.2009, 16:39   #3
Kanaris
Новичок
Джуниор
 
Регистрация: 04.12.2009
Сообщений: 2
По умолчанию

Имеются, но на Indy, и то очень кривые. Во-первых, асинхронно, как-то непоследовательно посылается запрос и ответ, во-вторых, только одно соединение, в третьих, мне сказали, что лучше реализовать через TClientSocket и TServerSocket. Но у меня уже мозг пухнет от чтения документации и разборки примеров. Если не сложно, пожалуйста наваяйте пару строк, как это сделать через сокеты, самое главное, чтобы поддерживалось несколько соединений (именно с этим у меня ничего не получается).

Вот мои попытки:

Код:
// открыть сервер на 888 порту при нажатии кнопки "старт"
procedure TForm1.Button1Click(Sender: TObject);
begin
  ServerSocket1.Port := 888;
  ServerSocket1.Open;
end;

// стоп
procedure TForm1.Button2Click(Sender: TObject);
begin
      {Останавливаем сервер}
      ServerSocket1.Active := False;
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
      {От клиента получено сообщение - выводим его в Memo1}
      Memo1.Lines.Insert(0,'Message received from client');
      text:=Socket.ReceiveText;
      Memo1.Lines.Insert(0,'> '+text);

      ClientSocket1.Host := 'htmlbook.ru';
      ClientSocket1.Port := 80;
      ClientSocket1.Open;
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
// отрпавляет текст на сайт
  Socket.sendtext(text);
//  listbox1.items.add('< hello!');
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
begin
// получает ответ с сервера
  text2:=PChar(Socket.ReceiveText);
  ShowMessage('read result '+text2);

  Memo1.Lines.Insert(0,'> '+text2);
  // ClientSocket1.Close;
end;

procedure TForm1.ServerSocket1ClientWrite(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  // ShowMessage('lol '+text2);
    Socket.SendText(text2);
      Memo1.Lines.Insert(0,'> '+text2);
end;
Kanaris вне форума Ответить с цитированием
Старый 04.12.2009, 16:58   #4
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

Надо на ServerSocket1ClientRead отправлять
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
Паскаль. 2 задачи (Программа "Верификация","КАК БРИГАДИРУ РАЗДЕЛИТЬ ЗАРОБОТАННЫЕ ДЕНЬГИ") Valik102 Помощь студентам 3 20.05.2009 20:42
Создаю диаграмму "Bar". Подскажите как убрать растояние между "столбами" MAcK Компоненты Delphi 11 24.10.2007 10:49
Как реализовать "Click pass through" ? Legat Win Api 1 15.10.2007 19:35