1

私はネットワークプログラミングへのbeejのガイドと呼ばれるこの本を読んでいます、そしてそれがgetaddrinfo()の使用を説明するサンプルコードを提供するという本の一部があります。この本は、以下のコードが「コマンドラインで指定したホストのIPアドレスを出力する」と述べています-ネットワークプログラミングに関するbeejのガイド。

今、興味があり、試してコードを実行したいのですが、コードはUNIX環境で開発され、Visual Studio 2012 Windows 7 OSを使用しており、ほとんどのヘッダーがサポートされていなかったため、少し調べてみると、Windows用のwinsock.hとws2_32.libを含める必要があることがわかりました。これを機能させるには、幸いすべてがエラーなしでコンパイルされましたが、デバッガーを使用して実行し、'www.googleに入れました。コマンド引数としてのcom'ipaddressが出力されなかったことに失望しました。コンソールから取得した出力は、「getaddrinfo:E」です。

  • 文字Eはどういう意味ですか?
  • デバッガーから何かを構成する必要がありますか?

  • 興味深いことに、コマンド引数を空白のままにして、出力を「usage:showiphostname」
    に変更しました。

どんな助けでもいただければ幸いです。

#ifdef _WIN32
#endif

#include <sys/types.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iostream>

using namespace std;

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <winsock.h>

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

int main(int argc, char *argv[])
{
    struct addrinfo hints, *res, *p;
    int status;
    char ipstr[INET6_ADDRSTRLEN];
    if (argc != 2) {
        fprintf(stderr,"usage: showip hostname\n");
        system("PAUSE");
        return 1;
    }
    memset(&hints, 0, sizeof hints);
    hints.ai_family = AF_UNSPEC; // AF_INET or AF_INET6 to force version
    hints.ai_socktype = SOCK_STREAM;
    if ((status = getaddrinfo(argv[1], NULL, &hints, &res)) != 0) {
        fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(status));
        system("PAUSE");
        return 2;
    }
    printf("IP addresses for %s:\n\n", argv[1]);
    for(p = res;p != NULL; p = p->ai_next) {
        void *addr;
        char *ipver;
        // get the pointer to the address itself,
        // different fields in IPv4 and IPv6:
        if (p->ai_family == AF_INET) { // IPv4
            struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr;
            addr = &(ipv4->sin_addr);
            ipver = "IPv4";
        } else { // IPv6
            struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)p->ai_addr;
            addr = &(ipv6->sin6_addr);
            ipver = "IPv6";
        }
        // convert the IP to a string and print it:
        inet_ntop(p->ai_family, addr, ipstr, sizeof ipstr);
        printf(" %s: %s\n", ipver, ipstr);
    }
    freeaddrinfo(res); // free the linked list

    system("PAUSE");

    return 0;
}
4

2 に答える 2

1

Windows でソケット API を使用する場合の要件である、Windows ソケット レイヤーの初期化を怠っています。WSAStartup()これを行うには、関数を使用します。

int main(int argc, char *argv[]) 
{
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;

    /* Use the MAKEWORD(lowbyte, highbyte) macro declared in Windef.h */
    wVersionRequested = MAKEWORD(2, 2);

    err = WSAStartup(wVersionRequested, &wsaData);
    if (err != 0) {
        /* Tell the user that we could not find a usable */
        /* Winsock DLL.                                  */
        printf("WSAStartup failed with error: %d\n", err);
        return 1;
    }

   ... your code here...

    WSACleanup();
}
于 2012-11-15T23:01:25.553 に答える
0

どういうわけかgai_strerrorの16ビットユニコードバージョンを取得し、それを8ビットprintfで使用しようとしたため、「getaddrinfo:E」が表示される可能性があります。したがって、文字「E」は「E」バイトとゼロバイトで構成され、8ビット文字列として解釈されると文字列を終了します。

それについてはよくわかりません。ここhttp://msdn.microsoft.com/en-us/library/windows/desktop/ms738514(v=vs.85).aspxを見て、ANSIバージョンもあるという考えを思いつきました。

于 2012-11-15T23:00:27.393 に答える