Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2004.06.20;
Скачать: [xml.tar.bz2];

Вниз

Проблемы с получение hmtl страницы   Найти похожие ветки 

 
IncubuS ©   (2004-04-29 11:08) [0]

Знакомый прислал исходник, написаный на C, для получения внешнего ip-адреса. Все у него работает, все замечательно. Я переделал его на Delphi и у меня возникли проблемы. Иногда при запросе страницы я получаю от сервера только шапку:

HTTP/1.0 200 OK
Server: Cherokee/0.4.6
Pragma: no-cache
Cache-Control: no-cache
Content-Type: text/html
Connection: close

И все, содержимого страницы нет. :( Иногда же все работает нормально. Причину выяснить я не могу, кроме того что ioctlsocket иногда возвращает размер шапки. Вот сам код:


uses Windows, WinSock;

{$APPTYPE CONSOLE}
{$DEFINE DEBUG}

function WaitForData(S: TSocket; nTimeout: Cardinal): Boolean;
var
 fdSet: TFDSet;
 T: Ttimeval;
 zSelect: Integer;
begin
 Result := False;
 FD_ZERO(fdSet);
 FD_SET(S, fdSet);
 T.tv_sec := nTimeout;
 T.tv_usec := 0;
 zSelect := select(0, @fdSet, nil, nil, @T);
 if (zSelect = SOCKET_ERROR) or not FD_ISSET(S, fdSet) then Exit;
 Result := True
end;

function GetOnlineIP(var szIPAddress: String): Boolean;
const
 AddrMask = "Current IP Address:";
var
 Sock: TSocket;
 lpHostEntry: PHostEnt;
 saServer: TSockAddrIn;
 nRet, Size, lPos: Integer;
 DataIn, Request: String;
begin
 Result := False;
 szIPAddress := "";
 Sock := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 if Sock = INVALID_SOCKET then Exit;
 try
   lpHostEntry := gethostbyname("checkip.dyndns.org");
   if lpHostEntry = nil then Exit;
   saServer.sin_family := AF_INET;
   saServer.sin_addr := PInAddr(lpHostEntry.h_addr_list^)^;
   saServer.sin_port := htons(8245);
   nRet := connect(Sock, saServer, SizeOf(saServer));
   if nRet = SOCKET_ERROR then Exit;
   Request := "GET / HTTP/1.1"#13#10"Host: checkip.dyndns.org"#13#10#13#10;
   send(Sock, Request[1], Length(Request), 0);
   if not WaitForData(Sock, 5) then Exit;
   DataIn := "";
   repeat
     ioctlsocket(Sock, FIONREAD, Size);
     if Size > 0 then begin
       SetLength(DataIn, Size + Length(DataIn));
       if recv(Sock, DataIn[Length(DataIn) - Size + 1], Size, 0) = SOCKET_ERROR then Break;
     end;
{$IFDEF DEBUG}
     Writeln("Size: ", Size);
{$ENDIF}
   until Size = 0;
 finally
   CloseSocket(Sock);
 end;
{$IFDEF DEBUG}
 Writeln;
 Writeln(DataIn);
 Writeln;
{$ENDIF}
 lPos := Pos(AddrMask, DataIn);
 if lPos <> 0 then begin
   Delete(DataIn, 1, lPos + Length(AddrMask));
   szIPAddress := Copy(DataIn, 1, Length(DataIn) - Pos("<", DataIn));
   Result := True
 end
end;

var
 Version: Word;
 wsaData: TWSADATA;
 IPAddress: String;

begin
 Version := MAKEWORD(1, 1);
 WSAStartup(Version, wsaData);
 if GetOnlineIP(IPAddress) then
   Writeln("Your IP: " + IPAddress);
 WSACleanup
end.


 
Verg ©   (2004-04-29 11:45) [1]

  DataIn := "";
  repeat
    if not WaitForData(Sock, 5) then break;
    if ioctlsocket(Sock, FIONREAD, Size) = SOCKET_ERROR then break;
    if Size > 0 then begin
    begin
      SetLength(DataIn, Size + Length(DataIn));
      Size := recv(Sock, DataIn[Length(DataIn) - Size + 1], Size, 0);
    end;
{$IFDEF DEBUG}
    Writeln("Size: ", Size);
{$ENDIF}
  until Size <= 0;


 
IncubuS ©   (2004-04-29 14:05) [2]

Verg, большое тебе спасибо!


 
Verg ©   (2004-04-29 14:11) [3]


> IncubuS ©   (29.04.04 14:05) [2]


Объяснил бы - зачем тебе это?
Есть способы и проще узнать свой IP адрес :)))


 
IncubuS ©   (2004-04-30 05:37) [4]

Verg, этот способ определяет адрес интерфейса, через который я, находясь в локальной сети, хожу в инет. ;) А какие еще могут быть способы, буду рад узнать? ;-)


 
Verg ©   (2004-04-30 07:16) [5]


> IncubuS ©   (30.04.04 05:37) [4]
> Verg, этот способ определяет адрес интерфейса, через который
> я, находясь в локальной сети, хожу в инет. ;) А какие еще
> могут быть способы, буду рад узнать? ;-)


Т.е. надо понимать, что этих интерфейсов у тебя несколько?


 
IncubuS ©   (2004-04-30 08:00) [6]

Несколько и они находятся не на моей машине. ;) Локальные ip-адреса определить не проблема.


 
Verg ©   (2004-04-30 08:06) [7]


> Локальные ip-адреса определить не проблема.


А какой же адрес ты получишь при помощи приведенного тобой кода?


 
IncubuS ©   (2004-04-30 08:13) [8]

В моей конфигурации: адрес внешнего интерфейса машины, находящейся в локальной сети и на которой поднят NAT. При dialup: адрес ppp-интерфейса и т.п. и т.д.



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2004.06.20;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.033 c
1-1086323589
korvin
2004-06-04 08:33
2004.06.20
Дополнить QReport


6-1083253140
Need_HELP:-)
2004-04-29 19:39
2004.06.20
Нужен исходник чата


1-1086672440
BanderLog_t
2004-06-08 09:27
2004.06.20
TreeView с CheckBox


1-1086757602
sapsi
2004-06-09 09:06
2004.06.20
Попап меню


8-1080716689
Stas
2004-03-31 11:04
2004.06.20
Переворот изображения





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский