Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Como saber si una URL está en servidor con IPv6 (https://www.clubdelphi.com/foros/showthread.php?t=94397)

elrayo76 22-01-2020 21:11:54

Como saber si una URL está en servidor con IPv6
 
Buenas,


En esta ocación lo que necesito es de alguna manera poder hacer un ping ya sea con o sin Proxy. Para ello se que atravez de un proxy uno tiene que autenticarse. Además me interesaría que pueda funcionar tanto para servidores que tienen IPv4 o IPv6


He visto en estos y otros foros algunas funciones pero no se si la verdad funcionan con IPv6, no tuve oportunidad de poder probarlas. Como comentario puedo agregar por investigación que para las direcciones de IPv6 a la dirección se le debe agregar [] para que las reconozca como tal (RFC 2732).


Si el tema es como comente antes agregar esos corchetes como es que hacen los navegadores para identificar las direcciones sin que el usuario los ingrese?.


Saludos,
El Rayo

elrayo76 25-01-2020 03:48:40

Como veo que nadie tiene una respuesta les paso algo mas de info a ver si se aclara lo que necesito.


El tema es que tengo una función como la que pongo y que fue tomada de otro foro.



Código Delphi [-]
function AuthenticateProxy(aURL: PChar; const aUserName, aPassword: String): Boolean;
var
  poiInternetOpen: HINTERNET;
  poiInternetConnect: HINTERNET;
  poiInternetRequest: HINTERNET;
  recUrlComponents: URL_COMPONENTS;
  dwdStatus: DWORD;
  dwdStatusSize: DWORD;
  i: DWORD;

begin
  Result := False;
  dwdStatusSize := SizeOf(dwdStatus);

  // Con esto se puede usar una dirección o una IP para llegar al destino.
  ZeroMemory(@recUrlComponents, SizeOf(URL_COMPONENTS));
  recUrlComponents.dwStructSize := SizeOf(URL_COMPONENTS);
  recUrlComponents.dwHostNameLength := INTERNET_MAX_HOST_NAME_LENGTH;

  // Descompone una URL en las partes que la componen.
  // Más información ver: https://docs.microsoft.com/en-us/win...ernetcrackurla
  InternetCrackUrl(aURL, Length(aURL) + 1, 0, recUrlComponents);
  // Inicializa el uso de una aplicación de las funciones WinInet.
  // Más información ver: https://docs.microsoft.com/en-us/win...-internetopena
  poiInternetOpen := InternetOpen('agent', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  // Abre una sesión del File Transfer Protocol (FTP) o HTTP.
  // Más información ver: https://docs.microsoft.com/en-us/win...ternetconnecta
  poiInternetConnect := InternetConnect(poiInternetOpen, recUrlComponents.lpszHostName, INTERNET_INVALID_PORT_NUMBER,
    nil, nil, INTERNET_SERVICE_HTTP, 0, 0);
  // Crea el request de HTTP.
  // Más información ver: https://docs.microsoft.com/en-us/win...tpopenrequesta
  poiInternetRequest := HttpOpenRequest(poiInternetConnect, 'GET', recUrlComponents.lpszHostName, nil, nil, nil, INTERNET_FLAG_KEEP_CONNECTION, 0);

  for i := 0 to 1 do
  begin
      // Envia el request específico al servidor HTTP
      // Más información ver: https://docs.microsoft.com/en-us/win...tpsendrequesta
      HttpSendRequest(poiInternetRequest, nil, 0, nil, 0);
      // Recibe la información del encabezado (header) asociado con el request HTTP.
      // Más información ver: https://docs.microsoft.com/en-us/win...httpqueryinfoa
      HttpQueryInfo(poiInternetRequest, HTTP_QUERY_FLAG_NUMBER or HTTP_QUERY_STATUS_CODE, @dwdStatus, dwdStatusSize, PCardinal(0)^);

      // Se requiere autentificación en el Proxy o en el servidor
      if (dwdStatus = HTTP_STATUS_PROXY_AUTH_REQ) or (dwdStatus = HTTP_STATUS_DENIED) then
      begin
        // Setea las opciones de Internet.
        // Más información ver: https://docs.microsoft.com/en-us/win...rnetsetoptiona

        // Introducimos UserName.
        InternetSetOption(poiInternetRequest, INTERNET_OPTION_PROXY_USERNAME, PChar(aUserName), Length(aUserName) + 1);
        // Introducimos el Password.
        InternetSetOption(poiInternetRequest, INTERNET_OPTION_PROXY_PASSWORD, PChar(aPassWord), Length(aPassWord) + 1);
      end;
  end;

  InternetCloseHandle(poiInternetOpen);
  InternetCloseHandle(poiInternetConnect);
  InternetCloseHandle(poiInternetRequest);

  Result := (dwdStatus <> HTTP_STATUS_PROXY_AUTH_REQ) and (dwdStatus <> HTTP_STATUS_DENIED);
end;


Esto lo que hace es autenticar una URL pasando por el proxy. Con esto también podríamos decir que sabemos si se tiene conexión a internet si es que no se puede llegar a la URL.


El caso es que no se como hacer lo mismo pero para direcciones que están en servidores con IPv6. Todo esto por lo expuesto en mi primer mensajes.


Lo único que se me ocurrió es cuando la función toma la URL que se le agregue los corchetes y validar por IPv6, si todo sale bien es que hay internet contra el servidor ese, en caso de error validar por IPv4. Pero mi pregunta es la siguiente, ¿esta función funciona con IPv6?


¿Los navegadores cuando uno ingresa la URL y la tienen que mostrar primero agregan los corchetes para ver si existe en un servidor IPv6 para luego según el resultado salir a buscar en un servidor de IPv4?



Saludos,
El Rayo


La franja horaria es GMT +2. Ahora son las 04:20:38.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi