<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=82758&amp;view=findpost&amp;p=606232</guid>
        <pubDate>Wed, 09 Feb 2005 09:43:03 +0000</pubDate>
        <title>WhoIs</title>
        <link>https://forum.sources.ru/index.php?showtopic=82758&amp;view=findpost&amp;p=606232</link>
        <description><![CDATA[Rouse_: <div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">////////////////////////////////////////////////////////////////////////////////</div><div class="code_line">//</div><div class="code_line">// &nbsp;****************************************************************************</div><div class="code_line">// &nbsp;* Project Name : WhoIs</div><div class="code_line">// &nbsp;* Unit Name &nbsp; &nbsp;: uMain</div><div class="code_line">// &nbsp;* Purpose &nbsp; &nbsp; &nbsp;: Демонстрационный пример получения информации с WhoIs сервера.</div><div class="code_line">// &nbsp;* Author &nbsp; &nbsp; &nbsp; : Александр (Rouse_) Багель</div><div class="code_line">// &nbsp;* Version &nbsp; &nbsp; &nbsp;: 1.00</div><div class="code_line">// &nbsp;****************************************************************************</div><div class="code_line">//</div><div class="code_line">&nbsp;</div><div class="code_line">unit uMain;</div><div class="code_line">&nbsp;</div><div class="code_line">interface</div><div class="code_line">&nbsp;</div><div class="code_line">uses</div><div class="code_line">&nbsp;&nbsp;Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,</div><div class="code_line">&nbsp;&nbsp;Dialogs, StdCtrls, ExtCtrls, Winsock;</div><div class="code_line">&nbsp;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;TfrmMain = class(TForm)</div><div class="code_line">&nbsp;&nbsp; &nbsp;edServer: TLabeledEdit;</div><div class="code_line">&nbsp;&nbsp; &nbsp;edRecipient: TLabeledEdit;</div><div class="code_line">&nbsp;&nbsp; &nbsp;GroupBox1: TGroupBox;</div><div class="code_line">&nbsp;&nbsp; &nbsp;memReport: TMemo;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Button1: TButton;</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure Button1Click(Sender: TObject);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;frmMain: TfrmMain;</div><div class="code_line">&nbsp;</div><div class="code_line">implementation</div><div class="code_line">&nbsp;</div><div class="code_line">{$R *.dfm}</div><div class="code_line">&nbsp;</div><div class="code_line">function WhoIs(Server, Query: String; Timeout: Integer;</div><div class="code_line">&nbsp;&nbsp;var Response: TStringList): Boolean;</div><div class="code_line">const</div><div class="code_line">&nbsp;&nbsp;MAXBLOCKSIZE = 1024;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;WSAData: TWSAData;</div><div class="code_line">&nbsp;&nbsp;hSocket: TSocket;</div><div class="code_line">&nbsp;&nbsp;Addr_in: sockaddr_in;</div><div class="code_line">&nbsp;&nbsp;Host: PHostEnt;</div><div class="code_line">&nbsp;&nbsp;InAddr, NoBlock: u_long;</div><div class="code_line">&nbsp;&nbsp;FDSet: TFDSet;</div><div class="code_line">&nbsp;&nbsp;Time: timeval;</div><div class="code_line">&nbsp;&nbsp;Buff: array [0..MAXBLOCKSIZE - 1] of Char;</div><div class="code_line">&nbsp;&nbsp;RecvCount: Integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;// инициализируем WinSock</div><div class="code_line">&nbsp;&nbsp;Result := WSAStartup(MakeWord(1, 0), WSAData) = NOERROR;</div><div class="code_line">&nbsp;&nbsp;if not Result then Exit;</div><div class="code_line">&nbsp;&nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp;// создаем сокет</div><div class="code_line">&nbsp;&nbsp; &nbsp;hSocket := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if hSocket = INVALID_SOCKET then</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Result := False;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Exit;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;// Определяем, что ввел пользователь имя хоста или его адрес</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;InAddr := inet_addr(PChar(Server));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if InAddr = INADDR_NONE then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Host := gethostbyname(PChar(Server));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if not Assigned(Host) then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Result := False;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Exit;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;InAddr := PInAddr(Host.h_addr_list^)^.S_addr;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;// Подготавливаем структуру для соединения</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;FillChar(Addr_in, SizeOf(sockaddr_in), 0);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Addr_in.sin_addr.S_addr := InAddr;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Addr_in.sin_family:= AF_INET;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Addr_in.sin_port := htons(IPPORT_WHOIS);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;// Устанавливаем интервалы таймаута</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;setsockopt(hSocket, SOL_SOCKET, SO_RCVTIMEO, @Timeout, SizeOf(Integer));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;setsockopt(hSocket, SOL_SOCKET, SO_SNDTIMEO, @Timeout, SizeOf(Integer));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;// Соединение с сервером - довольно долгий процесс, поэтому мы поступим по</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;// хитрому - а именно переводим сокет в неблокирующий режим</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;NoBlock := 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ioctlsocket(hSocket, FIONBIO, NoBlock);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;// соединяемся</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if connect(hSocket, Addr_in, SizeOf(sockaddr_in)) = SOCKET_ERROR then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;case WSAGetLastError of</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Обычно при неблокирующем соединении выдается вот эта ошибка</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// на попытку соединения, поэтому мы будем ждать окончания</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// соединения через select</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WSAEWOULDBLOCK:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;FD_ZERO(FDSet);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;FD_SET(hSocket, FDSet);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Time.tv_sec := Timeout div 1000;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Time.tv_usec := Timeout;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if select(0, nil, @FDSet, nil, @Time) &#60;&#62; 1 then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Result := False;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Exit;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Result := False;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Exit;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;// Соединились - теперь неблокирующий режим нам не нужен</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;// Возвращаем все как было</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;NoBlock := 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ioctlsocket(hSocket, FIONBIO, NoBlock);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;// Обязательно проверяем чтобы в конце запроса стояло #13#10</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Query := Query + sLineBreak;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;// И отправляем запрос серверу</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if Send(hSocket, Query[1], Length(Query), 0) = SOCKET_ERROR then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Result := False;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Exit;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;// Запрос отправлен - начинаем читать данные пока не кончатся</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;RecvCount := 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;while RecvCount &#62; 0 do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;RecvCount := recv(hSocket, Buff, MAXBLOCKSIZE, 0);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Response.Text := Response.Text + String(Buff);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;finally</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;// Завершаем установленную сессию</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;shutdown(hSocket, SD_BOTH);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;// Закрываем сокет</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;closesocket(hSocket);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;finally</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Деинициализируем WinSock</div><div class="code_line">&nbsp;&nbsp; &nbsp;WSACleanup;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TfrmMain.Button1Click(Sender: TObject);</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;S: TStringList;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;S := TStringList.Create;</div><div class="code_line">&nbsp;&nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp;// edServer.Text = whois.alldomains.com</div><div class="code_line">&nbsp;&nbsp; &nbsp;// edRecipient.Text = borland.com</div><div class="code_line">&nbsp;&nbsp; &nbsp;WhoIs(edServer.Text, edRecipient.Text, 10000, S);</div><div class="code_line">&nbsp;&nbsp; &nbsp;memReport.Lines.Assign(S);</div><div class="code_line">&nbsp;&nbsp;finally</div><div class="code_line">&nbsp;&nbsp; &nbsp;S.Free;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">end.</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
Проект также доступен по адресу: http://rouse.drkb.ru/network.php#whois]]></description>
        <author>Rouse_</author>
        <category>Интернет, сети, протоколы</category>
      </item>
	
      </channel>
      </rss>
	