2009-11-15 3 views

Répondre

1

grâce à Solved: http://www.codeguru.com/forum/showthread.php?t=233261


#include <winsock2.h> 
#include <stdio.h> 
#include <stdlib.h> 

#pragma comment(lib, "ws2_32.lib") 

int main(int nArgumentCount, char **ppArguments) 
{ 
    WSADATA WSAData; 

    // Initialize WinSock DLL 
    if(WSAStartup(MAKEWORD(1, 0), &WSAData)) 
    { 
     // Error handling 
    } 

    // Get local host name 
    char szHostName[128] = ""; 

    if(gethostname(szHostName, sizeof(szHostName))) 
    { 
     // Error handling -> call 'WSAGetLastError()' 
    } 

    SOCKADDR_IN socketAddress; 
    hostent *pHost  = 0; 

    // Try to get the host ent 
    pHost = gethostbyname(szHostName); 
    if(!pHost) 
    { 
     // Error handling -> call 'WSAGetLastError()' 
    } 

    char ppszIPAddresses[10][16]; // maximum of ten IP addresses 
    for(int iCnt = 0; (pHost->h_addr_list[iCnt]) && (iCnt < 10); ++iCnt) 
    { 
     memcpy(&socketAddress.sin_addr, pHost->h_addr_list[iCnt], pHost->h_length); 
     strcpy(ppszIPAddresses[iCnt], inet_ntoa(socketAddress.sin_addr)); 

     printf("Found interface address: %s\n", ppszIPAddresses[iCnt]); 
    } 

    // Cleanup 
    WSACleanup(); 
} 
0

Linux:

ifconfig -a gives internal ip 
netstat -a gives default gateway 

Fenêtres:

ipconfig /all gives internal ip 
netstat -a gives default gateway 

Je ne suis pas sûr de savoir comment déterminer définitivement l'adresse IP externe dans les deux systèmes

+0

Désolé, j'ai oublié de mentionner que je voulais dire en C/++: D – Saul

+0

Je ne vois pas ma passerelle par défaut dans 'netstat -a' sur Linux ou Windows? Je vois la liste des connexions sur ma machine, y compris les ports d'écoute, mais nulle part sur cette liste je ne vois le nom d'hôte ou l'adresse IP de ma passerelle par défaut. Qu'est-ce que je rate? – mrduclaw

+0

mon erreur, netstat -r donne la passerelle par défaut – ennuikiller

1

Il n'est pas un mécanisme généraliste qui fonctionne sous Windows et UNIX. Sous Windows, vous voulez commencer par GetIfTable(). Sous la plupart des systèmes UNIX, essayez getifaddrs(). Ceux-ci vous donneront diverses choses comme l'adresse IP de chaque interface.

Je ne suis pas sûr de savoir comment procéder pour obtenir la passerelle par défaut. Je suppose qu'il est disponible via une invocation de sysctl. Vous pourriez vouloir commencer avec la source pour the netstat utility.

L'adresse publique externe est quelque chose qu'un ordinateur ne sait jamais. Le seul moyen est de se connecter à quelque chose sur internet et de vous dire de quelle adresse vous venez. C'est l'un des problèmes classiques avec IPNAT.