Originariamente inviato da fatina biondina
solo ke su qualsiasi makkina mi da sempre lo stesso indirizzo ip
Certo, perché quello è l'indirizzo di "loopback" 127.0.0.1 che è uguale per tutti i computer!

codice:
#include <stdio.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main (void)
{
    char hname[256];
    struct hostent* he;
    char *addr;

    if (gethostname (hname, sizeof (hname)) == 0)
    {
        printf ("Hostname: %s\n", hname);

        he = gethostbyname (hname);

        if (he != NULL)
        {
            addr = inet_ntoa (*(struct in_addr*) he->h_addr_list[0]);

            printf ("Address: %s\n", addr);
        }
    }

    return 0;
}
Oppure puoi enumerare tutte le interfacce di rete:

codice:
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <net/if.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>

char *getifaddr (char *ifname)
{
    int fd;
    struct ifreq ifr;
    char *addr = NULL;
    struct sockaddr_in *sin = (struct sockaddr_in *) &ifr.ifr_ifru.ifru_addr;

    if ((fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
        return NULL;

    memset (&ifr, 0, sizeof (ifr));

    strcpy (ifr.ifr_name, ifname);
    sin->sin_family = AF_INET;

    if (ioctl (fd, SIOCGIFADDR, &ifr) == 0)
        addr = inet_ntoa (sin->sin_addr);

    close (fd);

    return addr;
}

int main (void)
{
    struct if_nameindex *ifni;

    ifni = if_nameindex ();

    while (ifni->if_name != NULL)
    {
        printf ("Interface %s %s\n", ifni->if_name, getifaddr (ifni->if_name));
        ifni++;
    }

    return 0;
}
Sorgenti testati su Linux (Slackware 9.1)