Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.20;
Скачать: CL | DM;

Вниз

Проблемы с получение 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.02 c
3-1085501585
gfr
2004-05-25 20:13
2004.06.20
умножение времени на тариф за переговоры


1-1086255722
ИМХО
2004-06-03 13:42
2004.06.20
EmptyDirectory: Boolean


1-1086297558
Deep_NEW
2004-06-04 01:19
2004.06.20
Про RichEdit.....


6-1082389980
Synaps
2004-04-19 19:53
2004.06.20
Никак не могу разобраться с Indy


14-1086378534
P@uk
2004-06-04 23:48
2004.06.20
Коллекция изображений