当前位置: 代码迷 >> VC/MFC >> VC升级VS2013 关于gethostbyname的有关问题
  详细解决方案

VC升级VS2013 关于gethostbyname的有关问题

热度:174   发布时间:2016-05-02 03:39:18.0
VC升级VS2013 关于gethostbyname的问题
warning C4996: 'gethostbyname': Use getaddrinfo() or GetAddrInfoW() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API

源代码如下

a.sock = socket( AF_INET, SOCK_STREAM, 0);
if (a.sock == INVALID_SOCKET) {
return -1;
}
else {
b.sin_family = AF_INET;
if ((phe = gethostbyname(PIPAddr)) == NULL) {
return -2;
}
else {
memcpy((char FAR *)&(b.sin_addr), phe->h_addr, phe->h_length);
。。。
如何将gethostbyname换成getaddrinfo或者是GetAddrInfoW,最好把代码贴出来,还请各位大神帮忙解决,小弟在此感激不尽。
------解决思路----------------------
getaddrinfo:https://msdn.microsoft.com/en-us/library/windows/desktop/ms738520(v=vs.85).aspx
GetAddrInfoW:https://msdn.microsoft.com/en-us/library/windows/desktop/ms738519(v=vs.85).aspx
------解决思路----------------------

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;

}