Tobias DiPasquale on 3 Mar 2004 13:57:02 -0000 |
On Wed, 2004-03-03 at 08:14, Jeff Abrahamson wrote: > I want to determine my own IP address. > > A kludgy way is to bind to a high port, send myself (on 127.0.0.1) a > packet containing only a long random number, and look at the from > address. Even then I might see 127.0.0.1, though. > > I bet there's a better way. Anyone know? > > If the box has multiple interfaces, the above fails. Is their a way > to get all the addresses that are me? A quick trip into UNIX Network Programming tells all... <code_sample> [...more #includes here...] #include <sys/param.h> const char *Inet_ntop( int family, const void *addrptr, char *strptr, size_t len) { const char *ptr; /* check for old code */ if (strptr == NULL) err_quit( "NULL 3rd argument to inet_ntop"); if ((ptr = inet_ntop( family, addrptr, strptr, len)) == NULL) err_sys( "inet_ntop error"); return( ptr); } char **my_addrs( int *addrtype) { struct hostent *hptr; char myname[MAXHOSTNAMELEN]; if (gethostname(myname, sizeof(myname)) < 0) return(NULL); if ((hptr = gethostbyname(myname)) == NULL) return(NULL); *addrtype = hptr->h_addrtype; return(hptr->h_addr_list); } int main( int argc, char **argv) { int addrtype; char **pptr, buf[INET6_ADDRSTRLEN]; if ((pptr = my_addrs( &addrtype)) == NULL) err_quit( "my_addrs error"); for (; *pptr != NULL; pptr++) printf( "\taddress: %s\n", Inet_ntop( addrtype, *pptr, buf, sizeof( buf))); exit(0); } </snip> NOTES: You will have to add some #include macros to make this code work. Also, you will have to replace err_quit() calls with something that works (e.g. fprintf( stderr, ...)). UNIX Network Programming is the ultimate reference for all things UNIX and network. This book is a bargain at three times the price, due to its highly-concentrated, no-nonsense, covers-every-damn-thing-you'd-ever-want-to-know nature. This place has good prices: http://www.bookpool.com/.x/dbqfbmkxjr/sm/0131411551 -- Tobias DiPasquale, www.cbcg.net 202A 04C4 2CE6 B985 8520 88D6 CD25 1A6C B9B5 1595 Attachment:
signature.asc
|
|