2012-10-15 60 views
1

Possible Duplicate:
Is there an alternative to inet_ntop/InetNtop in Windows XP?Windows套接字编程`inet_ntop链接错误()`

我新手,Socket编程。我写了我的第一个代码,并给出了一个链接器错误。我搜索了这个问题,但找不到解决方案。所以,我正在尝试堆栈交换。 (首次:-))

下面是代码和我使用Windows XP

#ifndef _WIN32_WINNT 
#define _WIN32_WINNT 0x0501 
#endif 


#include<stdio.h> 
#include<string.h> 
#include<winsock2.h> 
#include<Ws2tcpip.h> 

#ifndef INET6_ADDRSTRLEN 
#define INET6_ADDRSTRLEN 46 
#endif 

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

if(WSAStartup(MAKEWORD(1,1), &wsaData) != 0){ 
    fprintf(stderr, "WSAStartup failed.\n"); 
    return 1; 
} 

int status; 
struct addrinfo hints; 
struct addrinfo *res, *p; 
char ipstr[INET6_ADDRSTRLEN]; 

if(argc != 2){ 
    fprintf(stderr,"usage: Shows IP address of hostname.\n"); 
    return 1; 
} 

memset(&hints, 0 , sizeof hints); 

hints.ai_family = AF_UNSPEC; 
hints.ai_socktype = SOCK_STREAM; 

if((status = getaddrinfo(argv[1], NULL, &hints, &res)) != 0){ 
    fprintf(stderr, "getaddrinfo : %s \n", gai_strerror(status)); 
    return 2; 
} 

printf("IP addresses for %s:\n\n", argv[1]); 

for(p = res; p != NULL; p = p->ai_next){ 
    void *addr; 
    char *ipver; 

    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"; 
    } 

    inet_ntop(p->ai_family, addr, ipstr, sizeof ipstr); 
    printf("%s : %s\n",ipver, ipstr); 
} 

freeaddrinfo(res); 

WSACleanup(); 

return 0; 
} 

我使用下面的命令编译它:

gcc file.c "C:\Program Files\CodeBlocks\MinGW\lib\ws2_32.a" -o final.exe 

它给以下错误:

(.text+0x21d): undefined reference to 'inet_ntop' 
collect2: ld returned 1 exit status 

是的,我使用beej指南学习套接字编程。如果你想给我推荐一些其他不错的教程或书籍,请继续。谢谢。

+1

MSDN将此文档记录为可从Windows Vista获得:http://msdn.microsoft.com/en-us/library/windows/desktop/cc805843%28v=vs.85%29.aspx – alk

+0

这是重复的[在Windows XP中是否有替代inet_ntop/InetNtop?](http://stackoverflow.com/q/1561469/772981)。可能尽管谷歌搜索你应该使用内部的StackOverflow搜索。一个查询“winsock windows inet_ntop”很快给了我正确的链接。 – Jarekczek

+0

-1:我不知道你是如何搜索的,因为stackoverflow主题和其他人都清楚地表明,这在Windows上不起作用。 [Google的另一篇文章](http://memset.wordpress.com/2010/10/09/inet_ntop-for-win32/)。我搜索了“inet_ntop windows”。 – Jarekczek

回答

0

如果getaddrinfo()工作,getnameinfo()也可能工作。您可以使用它将您的struct sockaddr转换回数字表示。

+0

换句话说:Windows似乎不支持'inet_ntop'。我也无法链接它。我的mingw32库都不包含它。我看到有[InetNtop](http://msdn.microsoft.com/en-us/library/windows/desktop/cc805843%28v=vs.85%29.aspx),但从Vista开始。 – Jarekczek

+0

@Jarekczek对,但如果使用正确的标志(“数字”标志)调用'getnameinfo()'是一个可行的选择。 – glglgl