Nazwa hosta

Potrzebuje poznac nazwe hosta komputera korzystajacego z mojej aplikacji. Wyszukalem, ze mozna to uzyskac nastepujaco:

request.env['REMOTE_HOST']

niestety otrzymuje pusty string
wyczytalem takze, ze dziala to podobno na WEBricku, a na Mongrelu juz nie -nie sprawdzalem na tym pierwszym, ja mam Mongrela
z kolei

request.env['REMOTE_ADDR']

dziala poprawnie zwracajac adres IP zdalnej maszyny.
Wsrod innych sprawdzanych przeze mnie metod sa:

[code]require ‘socket’
Socket.gethostname

request.host

request.remote_host

request.raw_host_with_port[/code]
dodam tylko, ze hostname na maszynie zdalnej na pewno mam ustawiony. Inna aplikacja (PHP) zwraca poprawnie hostname za pomoca niniejszego wyrazenia

$user_host = gethostbyaddr($_SERVER['REMOTE_ADDR']);

czy w Rubym jest odpowiednik funkcji gethostbyaddr? nie znalazlem niczego takiego, z podobnych jest tylko:

Socket.gethostbyname(request.env['REMOTE_ADDR'])

ale nie zwraca spodziewanego rezulatu

znalazlem maly workaround na moj problem: skrypt PHP

<?php echo gethostbyaddr($argv[1]); ?>
a w Rubym:

<% ip=request.env['REMOTE_ADDR'] %> <% @result = `php /hostname.php "#{ip}"` %> <%= @result %>
Dziala!

Nie, no, to przerażające :wink:

Spróbuj może host #{ip} - tylko uważaj na escapowanie parametrów.

A poczytaj o metodach Socket::gethostbyname i Socket.getaddrinfo - to chyba właśnie o to Ci chodzi.

Socket.gethostbyaddr przyjmuje jako argument nie adres ip w postaci stringa typu ‘127.0.0.1’ tylko packed string. Przykład:

[code=ruby]irb(main):031:0> Socket.gethostbyname(“195.93.178.6”)
=> [“195.93.178.6”, [], 2, “\303]\262\006”]

irb(main):032:0> Socket.gethostbyaddr("\303]\262\006")
=> [“nasza-klasa.pl”, [], 2, “\303]\262\006”][/code]
Podanie zwykłego adresu ip w postaci stringa nie działa (przynajmniej u mnie):

irb(main):033:0> Socket.gethostbyaddr("195.93.178.6") SocketError: host not found from (irb):33:in `gethostbyaddr' from (irb):33
Nie pytajcie mnie dlaczego :slight_smile: Może ktoś inny wyjaśni dlaczego (i ewentualnie jak samemu zamienić stringa z ip na packed stringa w tej postaci nie korzystając z Socket.gethostbyname jak powyżej).

Przykład z wywołaniem php w widoku pokazuje, że web deweloperzy potrafią być bardzo kreatywni (nie zawsze w pozytywnym tego słowa znaczeniu) :smiley:

Ano u mnie też jakoś nie działa tak, jakbym tego oczekiwał. Ale zawsze można wywołać metodę dwa razy i zwrócić wynik drugiego wywołania.