现在的位置: 首页 > 综合 > 正文

VC下getaddrinfo使用

2013年09月15日 ⁄ 综合 ⁄ 共 3802字 ⁄ 字号 评论关闭

链接: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;

}

抱歉!评论已关闭.