Ver Mensaje Individual
  #9  
Antiguo 11-08-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Reputación: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por Antuan
Perdonar por haber cometido tan gran error.
Nada, hombre, qué dices, no hay nada que perdonar

Por otro lado con la función que escribes últimamente hay un pequeño problema para hacer que esta pase a devolver una cadena, o sea, una variable de tipo "string". ¿Porqué? Pues porque por algo devuelve el tipo que devuelve: la función se llama "GetIps" y puede devolver varias IPs, no solamente una.

Claro está, sería más sencillo de "recorrer" el resultado de la función para obtener cada una de las IPs devuelta, o una, si ese fuera el caso. Desconozco cómo hace lo que hace la función y si, por ejemplo, siempre devuelve una primera IP, digamos, principal, por defecto, acaso la que se persigue... de no ser así... devolver el resultado como "string" podría ocasionarte quebraderos de cabeza, puesto que la variable "resultado" podría contener más de una IP... y habría a partir de ahí que discriminarlas.

En todo caso, así quedaría la función devolviendo una cadena, un tipo "string", en lugar de un "TStrings":

Código Delphi [-]
   function getIPs: string;
  type
    TaPInAddr = array[0..10] of PInAddr;
    PaPInAddr = ^TaPInAddr;
  var
    phe: PHostEnt;
    pptr: PaPInAddr;
    Buffer: array[0..63] of Char;
    I: Integer;
    GInitData: TWSAData;
    temp: TStrings;
  begin
    Result := '';
    WSAStartup($101, GInitData);
    temp := TstringList.Create;
    temp.Clear;
    GetHostName(Buffer, SizeOf(Buffer));
    phe := GetHostByName(buffer);
    if phe = nil then Exit;
    pPtr := PaPInAddr(phe^.h_addr_list);
    I    := 0;
    try
      while pPtr^[i] <> nil do
      begin
        temp.Add(inet_ntoa(pptr^[i]^));
        Inc(I);
      end;
      Result := temp.Text;
    finally
      temp.Free;
    end;
    WSACleanup;
  end;
Se me ocurre a bote pronto, que, si no se encuentra otra forma mejor de hacerlo, tal vez podría cambiarse la siguiente instrucción a algo parecido a:

Código Delphi [-]
  if temp.Count > 0 then
    temp.Add(' $$ ' + inet_ntoa(pptr^[i]^))
  else
    temp.Add(inet_ntoa(pptr^[i]^));
De ese modo, en la cadena que obtuvieras como resultado, caso de haber más de una dirección IP obtendrías algo así como resultado:

Código:
  123.45.32.45 $$ 234.42.23.12
Acaso esos signos "dólar" pudieran servirte luego para averiguar, primero, si hay más de una IP en la cadena "resultado" y, en ese caso, conseguir todas las que hubiera, con ayuda de funciones como "Pos" y "Copy", por ejemplo.
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 11-08-2005 a las 13:14:29. Razón: (corrección del texto)
Responder Con Cita