0

C プログラミング言語でサーバーのパブリック IP を取得する方法を知りたいです。
libcurlでこれを行う方法はすでに知っていますが、ソケットプログラミングでこの情報を取得する方法を理解したいと思います(可能であれば)
私はすでに試しましstruct hostent *hpたが、ローカルアドレスしか得られません127.0.0.1
これは私が使用したコードです:

int main(int argc, char *argv[]){
    struct hostent *hp;
    int i=0;
    if((hp=gethostbyname(argv[1])) == NULL){
        herror("gethostbyname()");
        exit(1);
    }
    fprintf(stdout, "Hostname: %s\n", hp->h_name);
    /* fprintf (stdout,"IP server: %s\n",inet_ntoa(*((struct in_addr *)hp->h_addr))); con questa printo solo 1 ip */
    while (hp->h_addr_list[i] != NULL) { /* mentre così printo tutti gli eventuali ip */
        printf("IP: %s\n", inet_ntoa(*(struct in_addr*)(hp->h_addr_list[i])));
        i++;
    }
    return 0;
}
4

1 に答える 1

0

あなたはそれを自分で行うことはできません。信頼できる方法はありません。NAT ボックスの背後にいるとしましょう: 内部グローバル アドレス (つまり、NAT ボックスで使用されるパブリック アドレス) を知ることはできません。さらに、NAT ボックスには複数のパブリック アドレスがある場合があります。

これは、公開アドレスがあなたのアドレスではないために発生します。公開アドレスは単なる蜃気楼、つまり外部のホストがあなたを認識する方法です。したがって、それは理にかなっています。外部のホストに尋ねることによってのみ、それを見つけることができます.

TLDR

外部ホストにリクエストを送信します。

[cnicutar@fresh ~]$ curl ifconfig.me
192.0.2.42

libcurl独自のソケットを使用するか、それを使用してそれを行うのは簡単です。

于 2012-08-28T09:51:51.770 に答える