VC下getaddrinfo使用

链接:http://www.a3gs.com/BookViews.aspInfoID=2983&ClassID=821

VCgetaddrinfo使用

 

编号:A3GS_TV20100114001

 

描述:

 

本文以实例代码的形式讲述了在VC中下的getaddrinfo使用。

 

技术实现:

 

头文件

 

#include <winsock2.h>

#include <ws2tcpip.h>

 

库文件

 

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

 

例子函数

 

int _tmain(int argc, _TCHAR* argv[])

{

     //-----------------------------------------

     // Declare and initialize variables

     WSADATA wsaData;

     int iResult;

 

     DWORD dwRetval;

 

     int i = 1;

 

     char *port = "633224";

 

     struct addrinfo *result = NULL;

     struct addrinfo *ptr = NULL;

     struct addrinfo hints;

 

 

     // Validate the parameters

     if (argc != 2) {

         printf("usage: %s <hostname>/n", argv[0]);

         printf("  getaddrinfo provides protocol-independent translation/n");

         printf(   "   from an ANSI host name to an IP address/n");

         printf("      %s www.a3gs.com/n", argv[0]);

         return 1;

     }

     // Initialize Winsock

     iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);

     if (iResult != 0) {

         printf("WSAStartup failed: %d/n", iResult);

         return 1;

     }

 

     //--------------------------------

     // Setup the hints address info structure

     // which is passed to the getaddrinfo() function

     ZeroMemory( &hints, sizeof(hints) );

     hints.ai_family = AF_UNSPEC;

     hints.ai_socktype = SOCK_STREAM;

     hints.ai_protocol = IPPROTO_TCP;

 

 

     //--------------------------------

     // Call getaddrinfo(). If the call succeeds,

     // the result variable will hold a linked list

     // of addrinfo structures containing response

     // information

     dwRetval = getaddrinfo(argv[1], port, &hints, &result);

     if ( dwRetval != 0 ) {

         printf("getaddrinfo failed with error: %d/n", dwRetval);

         WSACleanup();

         return 1;

     }

 

     printf("getaddrinfo returned success/n");

 

     // Retrieve each address and print out the hex bytes

     for(ptr=result; ptr != NULL ;ptr=ptr->ai_next) {

 

         printf("getaddrinfo response %d/n", i++);

         printf("/tFlags: 0x%x/n", ptr->ai_flags);

         printf("/tFamily: ");

         switch (ptr->ai_family) {

              case AF_UNSPEC:

                   printf("Unspecified/n");

                   break;

              case AF_INET:

                   printf("AF_INET (IPv4)/n");

                   break;

              case AF_INET6:

                   printf("AF_INET6 (IPv6)/n");

                   break;

              case AF_NETBIOS:

                   printf("AF_NETBIOS (NetBIOS)/n");

                   break;

              default:

                   printf("Other %ld/n", ptr->ai_family);

                   break;

         }

         printf("/tSocket type: ");

         switch (ptr->ai_socktype) {

              case 0:

                   printf("Unspecified/n");

                   break;

              case SOCK_STREAM:

                   printf("SOCK_STREAM (stream)/n");

                   break;

              case SOCK_DGRAM:

                   printf("SOCK_DGRAM (datagram) /n");

                   break;

              case SOCK_RAW:

                   printf("SOCK_RAW (raw) /n");

                   break;

              case SOCK_RDM:

                   printf("SOCK_RDM (reliable message datagram)/n");

                   break;

              case SOCK_SEQPACKET:

                   printf("SOCK_SEQPACKET (pseudo-stream packet)/n");

                   break;

              default:

                   printf("Other %ld/n", ptr->ai_socktype);

                   break;

         }

         printf("/tProtocol: ");

         switch (ptr->ai_protocol) {

              case 0:

                   printf("Unspecified/n");

                   break;

              case IPPROTO_TCP:

                   printf("IPPROTO_TCP (TCP)/n");

                   break;

              case IPPROTO_UDP:

                   printf("IPPROTO_UDP (UDP) /n");

                   break;

              default:

                   printf("Other %ld/n", ptr->ai_protocol);

                   break;

         }

         printf("/tLength of this sockaddr: %d/n", ptr->ai_addrlen);

         printf("/tCanonical name: %s/n", ptr->ai_canonname);

     }

 

     freeaddrinfo(result);

     WSACleanup();

 

     return 0;

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
getaddrinfo函数是用于将主机名和服务名转化为套接字地址的函数。该函数可以根据传入的参数获取与主机名和服务名相匹配的地址信息,返回一个addrinfo结构体链表,每个结构体包含了主机名、服务名、协议、IP地址等信息。 下面是该函数的使用方法: ```c #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res); ``` 其中,node表示主机名或IP地址,service表示服务名或端口号,hints表示筛选条件,res表示返回的addrinfo结构体链表。 示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <netdb.h> #include <arpa/inet.h> int main(int argc, char *argv[]) { struct addrinfo hints, *res; int status; memset(&hints, 0, sizeof hints); // 清空hints结构体 hints.ai_family = AF_UNSPEC; // 既可以是IPv4也可以是IPv6 hints.ai_socktype = SOCK_STREAM; // 流式套接字 if (argc != 2) { fprintf(stderr, "usage: %s hostname\n", argv[0]); return 1; } if ((status = getaddrinfo(argv[1], NULL, &hints, &res)) != 0) { fprintf(stderr, "getaddrinfo error: %s\n", gai_strerror(status)); return 2; } printf("IP addresses for %s:\n\n", argv[1]); struct addrinfo *p; char ipstr[INET6_ADDRSTRLEN]; 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); // 释放addrinfo链表 return 0; } ``` 该程序接受一个主机名作为命令行参数,然后使用getaddrinfo函数获取该主机名对应的IP地址信息,并打印出所有的IP地址。其中,将hints结构体的ai_family成员设置为AF_UNSPEC表示既可以是IPv4也可以是IPv6,hints结构体的ai_socktype成员设置为SOCK_STREAM表示流式套接字。在for循环中,判断addrinfo结构体的ai_family成员,来确定IPv4或IPv6的地址信息,并使用inet_ntop函数将网络字节序转换为主机字节序的IP地址,并打印出来。最后,记得释放addrinfo链表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值