运行此代码段需要哪些头文件?

时间:2010-05-30 06:03:17

标签: c windows network-programming

它来自here,但在编译时失败:

int main(int argc, char **argv)
{
    struct hostent {
        char *h_name; // main name
        char **h_aliases; // alternative names (aliases)
        int h_addrtype; // address type (usually AF_INET)
        int h_length; // length of address (in octets)
        char **h_addr_list; // alternate addresses (in Network Byte Order)
    };
    #define h_addr h_addr_list[0] // First address of h_addr_list.


    struct hostent *info_stackoverflow;
    int i = 0;
    info_stackoverflow = gethostbyname( "www.stackoverflow.com" );
    printf("The IP address of %s is %s", 
           info_stackoverflow->h_name, 
           inet_ntoa( * ((struct in_addr *)info_stackoverflow->h_addr )));
    /* aliases */
    while( *(pc_ip->h_aliases + i) != NULL )
    {
        printf("\n\tAlias: %s", *(pc_ip->h_aliases + i) );
        i++;
    }
}

2 个答案:

答案 0 :(得分:0)

您需要这三个标题:

#include <stdio.h>
#include <netdb.h>
#include <arpa/inet.h>

你应该摆脱你自己的struct hostent的定义。它已在netdb.h中为您定义,您的定义将发生冲突。

提示:几乎在任何Unix系统上都尝试“man gethostbyname”;大多数C函数的手册页将告诉您要包​​含哪些头文件。

这仍然无法编译,因为pc_ip未定义。我猜你错过了部分代码片段。

答案 1 :(得分:0)

#include <stdio.h>
#include <winsock.h>

虽然Winsock已经定义了struct hostent,但您需要从代码段中删除hostent的定义。

正如dmazzoni所指出的那样,pc_ip未在该代码中声明。它被用作指向hostent结构的指针,因此您可以将pc_ip替换为info_stackoverflow

链接时,您需要链接ws2_32.lib。在运行时,您可能会遇到问题,直到您在代码开头添加WSAStartup,并在main返回之前最后WSACleanup。 / p>