getaddrinfo使用例子和socket编程的一些参考文章

原创 2015年07月08日 15:07:51

getaddrinfo的作用就是按照提示填充指定的数据结构,以供bind connect 等函数直接使用,无需手动填充所需数据结构 例如 sockaddr,这个函数的作用是替换以前的gethostbyname


例子:

/*
** showipandprot.c 
*/
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <netinet/in.h>

int main(int argc, char *argv[])
{
  struct addrinfo hints, *res, *p;
  int status;
  char ipstr[INET6_ADDRSTRLEN];
  uint16_t port;

  if (argc < 2) {
    fprintf(stderr,"usage: %s hostname  port\n",argv[0]);
    return 1;
  }

  memset(&hints, 0, sizeof hints);
  hints.ai_family = AF_UNSPEC; // AF_INET 或 AF_INET6 
  hints.ai_socktype = SOCK_STREAM;

  if ((status = getaddrinfo(argv[1], argv[2], &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";
      port =ntohs(((struct sockaddr_in*)p->ai_addr)->sin_port);
    } else { // IPv6
      struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)p->ai_addr;
      addr = &(ipv6->sin6_addr);
      ipver = "IPv6";
      port =ntohs(((struct sockaddr_in6*)p->ai_addr)->sin6_port);
    }

    // convert the IP to a string and print it:
    inet_ntop(p->ai_family, addr, ipstr, sizeof ipstr);
    printf(" %s: %s,port is %u\n", ipver, ipstr,port);
  }

  freeaddrinfo(res); 

  return 0;
}


ps:客户端程序也可以使用bind  使用某一个interface于服务器通信,如果指定了端口则使用指定端口进行通信,如果不指定端口则随机使用一个未被使用的端口

服务端也一样 如果没指定端口  则随机绑定监听一个端口



reference:

http://www.cnblogs.com/skynet/archive/2010/12/12/1903949.html#!comments

http://www.cnblogs.com/cxz2009/archive/2010/11/19/1881693.html

http://www.linuxhowtos.org/C_C++/socket.htm

http://beej-zhtw.netdpi.net/05-system-call-or-bust/5-1-getaddrinfo-start  本文的例子是在该文章里面的代码基础上修改的


linux环境编程中ruptime示例中的getaddrinfo

前几天在看linux环境编程中的套接字时,看到了ruptime的示例。于是乎自己将示例在本机演示了一翻。 刚开始怎么弄都不对,服务器端的getaddrinfo(host,"ruptime",&hin...
  • xukai6571186
  • xukai6571186
  • 2012年03月15日 10:32
  • 1087

unix网络编程之getaddrinfo函数详解及使用举例

getaddrinfo函数使用示例如下: (1)根据主机名获取IP地址: #include #include #include #include #include #include #in...
  • prettyshuang
  • prettyshuang
  • 2016年01月04日 17:04
  • 395

socket编程之addrinfo结构体与getaddrinfo函数

1. 概述 IPv4中使用gethostbyname()函数完成主机名到地址解析,这个函数仅仅支持IPv4,且不允许调用者指定所需地址类型的任何信息,返回的结构只包含了用于存储IPv4地址的...
  • DLUTBruceZhang
  • DLUTBruceZhang
  • 2013年04月23日 23:05
  • 6219

VC下getaddrinfo使用

链接:http://www.a3gs.com/BookViews.aspInfoID=2983&ClassID=821VC下getaddrinfo使用 编号:A3GS_TV20100114001 描述...
  • zhuxiufenghust
  • zhuxiufenghust
  • 2011年04月01日 23:59
  • 2773

getaddrinfo使用详解

getaddrinfo是在gethostbyname系列函数不支持Ipv6的情况下逐渐催生的,其能够处理名字到地址以及服务到端口这两种转换,返回一个sockaddr结构的链表,这些sockaddr地址...
  • renwotao2009
  • renwotao2009
  • 2015年10月02日 20:46
  • 897

socket编程总结(一)getaddrinfo()函数详解

/**  int  getaddrinfo(    const char* nodename,    const char* servname,    const struct addr...
  • u011146511
  • u011146511
  • 2016年07月12日 09:33
  • 917

getaddrinfo的用法详解 .

gethostbyname和gethostbyaddr这两个函数仅仅支持IPv4,getaddrinfo函数能够处理名字到地址以及服务到端口这两 种转换,返回的是一个sockaddr结构的链表而不是一...
  • liwentao1091
  • liwentao1091
  • 2011年08月04日 21:02
  • 6333

getaddrinfo()函数详解

 1. 概述IPv4中使用gethostbyname()函数完成主机名到地址解析,这个函数仅仅支持IPv4,且不允许调用者指定所需地址类型的任何信息,返回的结构只包含了用于存储IPv4地址的空间。IP...
  • tianxw1209
  • tianxw1209
  • 2011年03月28日 21:18
  • 21636

getaddrinfo简单应用——取得IP地址

getaddrinfo提供独立于协议的名称解析 函数原型:        #include sys/types.h>        #include sys/socket.h...
  • weiyuefei
  • weiyuefei
  • 2016年07月09日 13:05
  • 2487

为什么使用getaddrinfo()函数

在IPv6的应用中getaddrinfo()是很常见的,最常见的形式是: addrinfo hints; addrinfo *res = NULL; memset(&hints,0,sizeof(...
  • eddy_liu
  • eddy_liu
  • 2013年01月10日 18:56
  • 8845
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:getaddrinfo使用例子和socket编程的一些参考文章
举报原因:
原因补充:

(最多只允许输入30个字)