Newsgroup: it.comp.os.linux.development
Titolo: Ottenere nome simbolico host

Ho un server e un client in comunicazione tramite socket TCP, quando
il server è in ascolto e il client si connette ho bisogno di conoscere
il nome simbolico del client ed altre info, per ora riesco a ottenere
l'ip ma non so come fare ad ottenere il nome simbolico. Questa è la
funzione:
void funzione(int fd){
    struct sockaddr_in tmp;
    unsigned int addrlen=sizeof(tmp);
    getpeername(fd,(struct sockaddr*)&tmp,&addrlen);
    printf("Client: %s\n",inet_ntoa(tmp.sin_addr));
}
Siccome sono in locale quando invocata viene stampato 127.0.0.1,
quello che vorrei è fargli stampare localhost (il nome simbolico
appunto).

 appunto).
man getnameinfo 
"address-to-name translation in protocol-independent manner"
ilSimo
-- 
now playing: 
You'd never ever hear of Olathoe in the land of Lomar again, its story was
buried 26000 years ago where Polaris shines high in the sky. But if you find
a silver key in a black wooden box, you still may roam there in your dreams
and hear what once was huge walls, laughing beneath the ice and telling you
the whole tale.
                                Drakkar - The Walls Of Olathoe

 ilSimo
Non riesco bene a capire come devo usare getnameinfo nella mia
funzione, qualcuno ha idea?

 funzione, qualcuno ha idea?
google è tuo amico e ti passa tutte le man pages!!!
http://www.hmug.org/man/3/getaddrinfo.php
tale man page è particolarmente utile xkè include un esempio di utilizzo 
di tale funzione che come leggerai dovrebbe "sostituire" la vetusta 
gethostnyname
te dovresti essere interessato al cname se ho capito bene
dai anche un okkio qui
http://www.hmug.org/man/3/getnameinfo.php
buon divertimento con le socket!
;)
ciaozzz

 ciaozzz
sì, sì le avevo già trovate queste manpages infatti già avevo iniziato
a "smanettarci".
Allora c'è un passo che dice:
The sockaddr structure sa should point to either a sockaddr_in or
     sockaddr_in6 structure (for IPv4 or IPv6 respectively) that is
salen
     bytes long.
Ora la mia funzione prende in ingresso un int fd, che sarebbe in
effetti il descrittore della socket. Invece getnameinfo prende una
struttura sockaddr come primo parametro. Quindi in pratica dovrei cmq
usare getpeername, prendere l'indirizzo ip e metterlo nella struttura,
e poi passare la struttura alla getnameinfo???

 e poi passare la struttura alla getnameinfo???
si ma queste cose fai prima a provarle ke a kiederle
cmq dato che sei su tcp
lato client sei tu ke inizi la 3way quindi hai tutte le info
lato server devi fare la accept che ti ritorna cito testualmente: 
"sockaddr structure.  This structure is filled  in  with the address of 
the peer socket"
quindi hai gli elementi necessari per non dover chiamare la getpeername
tutto dipende da come imposti le tue funzioni/strutture
ciaozzz


Beh, ora è tardi per cambiare la struttura. Quindi avrei una cosa del
tipo:
void funzione(int fd){
// PRIMA PARTE
    struct sockaddr_in tmp;
    unsigned int addrlen=sizeof(tmp);
    getpeername(fd,(struct sockaddr*)&tmp,&addrlen);
//SECONDA PARTE
struct sockaddr *sa;
           socklen_t salen;
           char addr[NI_MAXHOST];
           struct addrinfo hints, *res;
           int error;
           error = getnameinfo(sa, salen, addr, sizeof(addr), NULL, 0,
NI_NAMEREQD);
}
Solo che mi manca legare le due parti, infatti sa dovrebbe puntare a
tmp, ma come si fa???
Sto imparando ora a fare pratica...