Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WhoIS через прокси, На WinSock 
:(
    Опции темы
Viy_2007
Дата 1.10.2008, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 27.11.2007

Репутация: нет
Всего: нет



Здравствуйте.

Собственно скачал я из инета код для получения инфы у хуиз сервера написанный Rouse_ (за что ему отдельное спасибо  smile) на WinSock, и встал вопрос как научить работать этот код через прокси? Пока в голову ничего не приходит. И вообще, имеет ли смысл совершенствовать этот код (код привожу ниже) или легче взять за основу что-то другое и там уже делать работу с прокси? Компоненты индейцев например... Кто что скажет по этому поводу?

Вообщем, буду рад любой помощи (желательно с примерами в исходниках  )) в этой области.
За ранее спасибо.

З.ы. если эта тема уже поднималась на форуме - извините, просто ткните меня в неё... Просто у меня почему-то перестал работать поиск по форуму, а администрация ресурса и модераторы на сколько я понял просто игнорят мои сообщения.

Код

function WhoIs(Server, Query: String; Timeout: Integer;
  var Response: TStringList): Boolean;
const
  MAXBLOCKSIZE = 1024;
var
  WSAData: TWSAData;
  hSocket: TSocket;
  Addr_in: sockaddr_in;
  Host: PHostEnt;
  InAddr, NoBlock: u_long;
  FDSet: TFDSet;
  Time: timeval;
  Buff: array [0..MAXBLOCKSIZE - 1] of Char;
  RecvCount: Integer;
begin
  // инициализируем WinSock
  Result := WSAStartup(MakeWord(1, 0), WSAData) = NOERROR;
  if not Result then Exit;
  try
    // создаем сокет
    hSocket := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if hSocket = INVALID_SOCKET then
    begin
      Result := False;
      Exit;
    end;
    try
      // Определяем, что ввел пользователь имя хоста или его адрес
      InAddr := inet_addr(PChar(Server));
      if InAddr = INADDR_NONE then
      begin
        Host := gethostbyname(PChar(Server));
        if not Assigned(Host) then
        begin
          Result := False;
          Exit;
        end;
        InAddr := PInAddr(Host.h_addr_list^)^.S_addr;
      end;
      // Подготавливаем структуру для соединения
      FillChar(Addr_in, SizeOf(sockaddr_in), 0);
      Addr_in.sin_addr.S_addr := InAddr;
      Addr_in.sin_family:= AF_INET;
      Addr_in.sin_port := htons(IPPORT_WHOIS);
      // Устанавливаем интервалы таймаута
      setsockopt(hSocket, SOL_SOCKET, SO_RCVTIMEO, @Timeout, SizeOf(Integer));
      setsockopt(hSocket, SOL_SOCKET, SO_SNDTIMEO, @Timeout, SizeOf(Integer));
      // Соединение с сервером - довольно долгий процесс, поэтому мы поступим по
      // хитрому - а именно переводим сокет в неблокирующий режим
      NoBlock := 1;
      ioctlsocket(hSocket, FIONBIO, NoBlock);
      // соединяемся
      if connect(hSocket, Addr_in, SizeOf(sockaddr_in)) = SOCKET_ERROR then
        case WSAGetLastError of
          // Обычно при неблокирующем соединении выдается вот эта ошибка
          // на попытку соединения, поэтому мы будем ждать окончания
          // соединения через select
          WSAEWOULDBLOCK:
          begin
            FD_ZERO(FDSet);
            FD_SET(hSocket, FDSet);
            Time.tv_sec := Timeout div 1000;
            Time.tv_usec := Timeout;
            if select(0, nil, @FDSet, nil, @Time) <> 1 then
            begin
              Result := False;
              Exit;
            end;
          end;
        else
          begin
            Result := False;
            Exit;
          end;
        end;
      // Соединились - теперь неблокирующий режим нам не нужен
      // Возвращаем все как было
      NoBlock := 0;
      ioctlsocket(hSocket, FIONBIO, NoBlock);
      // Обязательно проверяем чтобы в конце запроса стояло #13#10
      Query := Query + sLineBreak;
      // И отправляем запрос серверу
      if Send(hSocket, Query[1], Length(Query), 0) = SOCKET_ERROR then
      begin
        Result := False;
        Exit;
      end;
      // Запрос отправлен - начинаем читать данные пока не кончатся
      RecvCount := 1;
      while RecvCount > 0 do
      begin
        RecvCount := recv(hSocket, Buff, MAXBLOCKSIZE, 0);
        Response.Text := Response.Text + String(Buff);
      end;
    finally
      // Завершаем установленную сессию
      shutdown(hSocket, SD_BOTH);
      // Закрываем сокет
      closesocket(hSocket);
    end;
  finally
    // Деинициализируем WinSock
    WSACleanup;
  end;
end;

PM MAIL   Вверх
Matematik
Дата 1.10.2008, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

Репутация: 24
Всего: 50



Только Sock прокси http://ru.wikipedia.org/wiki/SOCKS

В Indy легко, кидаешь на форму 3 компонента, в Object Inspector соежиняешь их TIdWhois -> TIdIOHandlerSocket -> TIdSocksInfo
Настройки прокси, напрмиер
Код

IdSocksInfo1.Version := svSocks4;
IdSocksInfo1. Host :='socks.server.ru';
IdSocksInfo1. Port := 1080;

Поумолчанию прокси отключен, соединение идет напрямую
Код

IdSocksInfo1.Version := svNoSocks;



Это сообщение отредактировал(а) Matematik - 1.10.2008, 09:31
PM MAIL WWW ICQ   Вверх
Viy_2007
Дата 1.10.2008, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 27.11.2007

Репутация: нет
Всего: нет



Да, я понимаю что только Sock. Спасибо за помощь, я примерно так себе это и представлял, попробую. А для приведённого мной кода ничего не подскажете? Хотелось бы всё таки на WinSock всё это реализовать.

Это сообщение отредактировал(а) Viy_2007 - 1.10.2008, 16:51
PM MAIL   Вверх
Virtuals
Дата 1.10.2008, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 476
Регистрация: 27.11.2006

Репутация: 2
Всего: 11



Viy_2007, 
для нормального проки, согласно протоколу ...
нужно
подключится к прокси
послать 
Код

connect host:port

далее получаем ответ типа все пучком
ну а потом как обычно

ЗЫ главное чтоб проки не сопротивлялся smile 
PM MAIL ICQ   Вверх
Viy_2007
Дата 1.10.2008, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 27.11.2007

Репутация: нет
Всего: нет



Ну это да ) А как отправить имя домена информацию о котором мне нужно получить? Передать на прокси после "connect host:port", а он уже сам разберётся куда и что отправлять и вернёт инфу?

Это сообщение отредактировал(а) Viy_2007 - 1.10.2008, 18:45
PM MAIL   Вверх
Virtuals
Дата 1.10.2008, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 476
Регистрация: 27.11.2006

Репутация: 2
Всего: 11



 после "connect host:port"
и получения ответа от прокса что все пучком, вы получаете полноценное тцп соединение с host:port
соответственно продолжаете с 
Код

   // Обязательно проверяем чтобы в конце запроса стояло #13#10
      Query := Query + sLineBreak;
      // И отправляем запрос серверу
      if Send(hSocket, Query[1], Length(Query), 0) = SOCKET_ERROR then

 smile 
PM MAIL ICQ   Вверх
avilsy
  Дата 5.2.2010, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 5.2.2010

Репутация: нет
Всего: нет



Здравствуйте!
По дате сообщения вижу, что уже давно обсуждалось, но все же если автор заглянет или кто знающий ответит. Задача в принципе аналогичная стоит. Обращение к whois через прокси.
Без использования прокси запрос будет иметь вид:
Код

Query := Query + sLineBreak; //Query := 'domain.com'+#13#10;

В этом случае все здорово, никаких проблем.
Используем прокси, требующие авторизации, запрос, как я думаю должен быть таким:
Код

         Query := 'http://' + Server +':'+IntToStr(IPPORT_WHOIS)+ 'domain.com' 
         +sLineBreak
         +'Proxy-Authorization: Basic '+Base64Encode(ProxyLogin + ':' + ProxyPass)
         +sLineBreak;


Но прокси сервер мне возвращает ошибку '400 Bad Request'

Если изменить запрос, на такой:
Код

         Query := 'Get http://' + Server +':'+IntToStr(IPPORT_WHOIS)+ 'domain.com'+ ' HTTP/1.0'
         +sLineBreak
         +'Proxy-Authorization: Basic '+Base64Encode(ProxyLogin + ':' + ProxyPass)
         +sLineBreak;


То прокси уже не ругается, но службе whois передаются не те данные:
Domain:      get / domain.com http/1.0
Status:      invalid


Если кто-то знает, намекните пожалуйста как решить проблему.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0476 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.