Can't get correct address in string form
Hajimu UMEMOTO
ume at freebsd.org
Tue May 3 09:32:30 PDT 2005
Hi,
>>>>> On Tue, 3 May 2005 18:39:10 +0300
>>>>> Sergey <fenix at intercollab.net> said:
fenix> //get local address - local address is 192.168.0.250
fenix> if ((gaierr = getaddrinfo(argv[1], argv[2], &hints, &localaddr)) != 0)
fenix> errx(1, "%s port %s: %s", argv[1], argv[2], gai_strerror(gaierr));
You need to initialize hints before calling getaddrinfo(3).
fenix> inet_ntop(la->ai_family, la->ai_addr->sa_data, buf, sizeof(struct sockaddr));
The usage of inet_ntop(3) is wrong.
It should be something like:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <err.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv)
{
struct addrinfo hints, *la, *localaddr;
char buf[46];
int gaierr=0;
//get local address - local address is 192.168.0.250
bzero(&hints, sizeof(hints));
hints.ai_flags = AI_PASSIVE;
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
if ((gaierr = getaddrinfo(argv[1], argv[2], &hints, &localaddr)) != 0)
errx(1, "%s port %s: %s", argv[1], argv[2], gai_strerror(gaierr));
for (la = localaddr; la; la = la->ai_next)
{
switch (la->ai_family) {
case AF_INET:
inet_ntop(la->ai_family,
&((struct sockaddr_in *)la->ai_addr)->sin_addr,
buf, sizeof(buf));
break;
case AF_INET6:
inet_ntop(la->ai_family,
&((struct sockaddr_in6 *)la->ai_addr)->sin6_addr,
buf, sizeof(buf));
break;
default:
continue;
}
fprintf(stderr, "Address: %s\n", buf);
}
return 0;
}
You can use getnameinfo(3) to simplify usage of inet_ntop(3).
Sincerely,
--
Hajimu UMEMOTO @ Internet Mutual Aid Society Yokohama, Japan
ume at mahoroba.org ume@{,jp.}FreeBSD.org
http://www.imasy.org/~ume/
More information about the freebsd-hackers
mailing list