addrinfo 结构】的更多相关文章

typedef struct addrinfo {int             ai_flags;int            ai_family;int             ai_socktype;int         ai_protocol;size_t         ai_addrlen;char          *ai_canonname;struct sockaddr     *ai_addr;struct addrinfo     *ai_next;} ADDRINFOA…
addrinfo结构体原型 typedef struct addrinfo {    int ai_flags;        //AI_PASSIVE,AI_CANONNAME,AI_NUMERICHOST    int ai_family;        //AF_INET,AF_INET6    int ai_socktype;    //SOCK_STREAM,SOCK_DGRAM    int ai_protocol;    //IPPROTO_IP, IPPROTO_IPV4, IP…
struct sockaddr和struct sockaddr_in这两个结构体用来处理网络通信的地址. 一.sockaddr sockaddr在头文件#include <sys/socket.h>中定义,sockaddr的缺陷是:sa_data把目标地址和端口信息混在一起了,如下:   struct sockaddr {   sa_family_t sin_family;//地址族   char sa_data[14]; //14字节,包含套接字中的目标地址和端口信息   }; 二.sock…
addrinfo结构体定义如下: typedef struct addrinfo { int ai_flags;//指示在getaddrinfo函数中使用的选项的标志. int ai_family; int ai_socktype; int ai_protocol; size_t ai_addrlen; char *ai_canonname; struct sockaddr *ai_addr; struct addrinfo *ai_next;//指向链表中下一个结构的指针.此参数在链接列表的最…
注意:结构体之间不能直接进行强制转换, 必须先转换成指针类型才可以进行结构体间的类型转换, 这里需要明确的定义就是什么才叫强制转换. 强制转换是将内存中一段代码以另一种不同类型的方式进行解读, 因此转换的空间必须与源空间一一对应. 而结构体则是由不固定的多种类型变量组合而成, 因此强制转换时并不确定原格式与目标格式确定的对应关系, 例如一个结构体为3个变量, 而另一个则为2个, 那么就无法确定如何分配. 因此最简单的让计算机可以理解的方式就是先将结构体转换成指针, 然后将指针转换成目标格式, 再…
IPv4中使用gethostbyname()函数完成主机名到地址解析,但是该API不允许调用者指定所需地址类型的任何信息,返回的结构只包含 了用于存储IPv4地址的空间.为了解决该问题,IPv6中引入了getaddrinfo()的新API,它是协议无关的,既可用于IPv4也可用于 IPv6.调用该函数会获得一个addrinfo结构的列表,调用的返回值是addrinfo的结构(列表)指针. 本文结合在WinowsXP和Windows2003 Server上使用该函数的经验,对getaddrinfo…
[a] socket / socketpair #include <sys/socket.h> int socket(int domain, int type, int protocol) int socketpair(int domain, int type, int protocol, int sv[2])//成功返回套接字描述符,出错返回 -1  套接字描述符本质上是就是文件描述符 socket 类型由三个参数共同确定 domain:AF_UNIX / AF_LOCAL / AF_INE…
The getaddrinfo function provides protocol-independent translation from an ANSI host name to an address. int getaddrinfo( PCSTR      pNodeName, PCSTR      pServiceName, ADDRINFOA  *pHints, PADDRINFOA *ppResult ); pNodeName [in,可选]指向NULL终止的ANSI字符串的指针,…
gethostbyname和gethostbyaddr这两个函数仅仅支持IPv4,getaddrinfo函数能够处理名字到地址以及服务到端口这两 种转换,返回的是一个sockaddr结构的链表而不是一个地址清单.这些sockaddr结构随后可由套接口函数直接使用.如此以 来,getaddrinfo函数把协议相关性安全隐藏在这个库函数内部.应用程序只要处理由getaddrinfo函数填写的套接口地址结构.该函数在 POSIX规范中定义了. 1. addrinfo结构定义在头文件netdb.h中:s…
catalogue . 漏洞简述 . 调试环境搭建 . 漏洞利用 . 漏洞分析 . 缓解修复方案 1. 漏洞简述 0x1: 函数调用顺序 getaddrinfo (getaddrinfo.c) -> _nss_dns_gethostbyname4_r (dns-host.c) -> __libc_res_nsearch (res_query.c) -> __libc_res_nquery (res_query.c) -> __libc_res_nsend (res_send.c)…
通常说函数返回某个错误值,实际上是函数返回值为-1,而全局变量errno被置为指定的常值(即称函数返回这个错误值). exit终止进程,Unix在一个进程终止时总是关闭该进程所有打开的描述符. TCP三次握手完毕,accept返回,其返回值是一个称为已连接描述符(connected descriptor)的新描述符.调用close关闭与客户的连接. 套接字API. TCP状态转移图,11种状态. MSS,maximum segment size,最大分节大小.通常客户端主动打开时发送SYN的同时…
I/O完成端口原理见上一篇(可点击这里) 10.5.4.4 利用I/O完成端口实现Socket通信 (1)Accept和AcceptEx流程的比较 ①采用accept方式的流程示意图如下(普通的阻塞函数) ②采用AcceptEx方式的流程示意图如下(可工作在阻塞或非阻塞方式). [注意]:AcceptEx与Accept的不同 ①AcceptEx是在客户端连入之前,就把客户端的Socket建立好了.也就是说,AcceptEx是先建立的Socket,然后才发出的AcceptEx调用.即在进行客户端的…
getaddrinfo getaddrinfo的一个重要功能, 很方便的构造struct sockaddr_in对象, 把繁琐的构造过程隐藏起来 getaddrinfo兼有gethostbyname和getservbyname等四个函数的功能 能传入ip/port, hostname/port, ip/service, hostname/service的组合 如127.0.0.1/13, www.abc.com/80, 127.0.0.1/daytime #include <netdb.h>…
第1章 unix基础知识 1. char *strerror(int errnum) 该函数将errnum(就是errno值)映射为一个出错信息字符串,返回该字符串指针.声明在string.h文件中. 2.void perror(const char *s) 该函数基于当前的errno值,在标准出错文件中输出一条出错消息,然后返回.声明在stdio.h文件中.它首先输出由s指向的字符串,然后是一个冒号,一个空格,接着是errno值对应的出错信息,最后是一个换行符. 第2章 UNIX标准化及实现…
在学习用套接字做一些有意义的事情之前,需要知道如何确定一个目标通信进程. 进程的标识有两个部分:计算机的网络地址可以帮助标识网络上想与之通信的计算机,而服务可以帮助标识计算机上特定的进程. 1.字节序 运行在同一台计算机上的进程相互通信时,一般不用考虑字节的顺序(字节序),字节序是一个处理器架构特性,用于指示像整数这样的大数据类型的内部字节顺序.图16-1显示一个32位整数内部的字节是如何排序的. 图16-1 32位整数内部的字节序 如果处理器架构支持大端(big-endian)字节序,那么最大…
前言: 苹果官方出了新的规定,要求新上架的app都必须单独支持ipv6-only的网络. 准备工作: 搭建IPV6测试环境:http://blog.csdn.net/potato512/article/details/51680203  (注意:第2步,按住 Option 键,打开 共享,才能看到NAT64选项!) 问题的提出: 在ios应用的开发中,如果项目中网络层用的是SOCKET 底层 的api.需要在工程做 兼容ipv4和ipv6网络环境的处理. 解决方案: 服务器地址配置为域名,通过解…
epoll 是Linux内核中的一种可扩展IO事件处理机制,最早在 Linux 2.5.44内核中引入,可被用于代替POSIX select 和 poll 系统调用,并且在具有大量应用程序请求时能够获得较好的性能( 此时被监视的文件描述符数目非常大,与旧的 select 和 poll 系统调用完成操作所需 O(n) 不同, epoll能在O(1)时间内完成操作,所以性能相当高),epoll 与 FreeBSD的kqueue类似,都向用户空间提供了自己的文件描述符来进行操作. int epoll_…
本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie 最初代码:  这是一个简单的时间获取server程序.它和时间获取程序client一道工作. 它是 协议相关,把代码中出现的左边的字符串换为右边的,就变成了IPv6版本号的  IPv4 --> IPv6  sockaddr_in --> sockaddr_in6  AF_INET --> AF_INET6  sin_family --> sin6_family  sin_po…
今天看lsocket代码,发现有三个C函数,以前一直没有用过. 觉得特别有意思,一个strspn,一个strrchr,一个getaddrinfo. strspn #include <string.h> size_t strspn(const char *s , const char *accept); 计算从字符串s的起始位置开始,连续并且完全属于accept字符串中字符的个数(有点绕). 直接上代码: char *addr = "127.0.0.1"; int pfx =…
非阻塞的connect的实现例子出自Netscape的Web客户程序.客户先建立一个与某个Web服务器的HTTP连接,再获取一个主页.该主页往往含有多个对于其他网页的引用.客户可以使用非阻塞connect同时获取多个网页,以此取代每次只获取一个网页的串行获取手段.图16-12展示了一个并行建立多个连接的例子.最左边情形表示串行执行所有3个连接.假设第一个连接耗用10个时间单位,第二个耗时15个,第三个耗用4个,总机29个时间单位. 中间情形并行执行2个连接.在时刻0启动前2个连接,当其中之一结束…
本文转载自:http://www.ibm.com/developerworks/cn/linux/network/ping/ ping命令是用来查看网络上另一个主机系统的网络连接是否正常的一个工具.ping命令的工作原理是:向网络上的另一个主机系统发送ICMP报文,如果指定系统得到了报文,它将把报文一模一样地传回给发送者,这有点象潜水艇声纳系统中使用的发声装置. 例如,在Linux终端上执行ping localhost命令将会看到以下结果: PING localhost.localdomain…
一.功能 对于IPv4和IPv6均适用,可以处理名字到地址以及服务到端口这两种变换,返回的是一个sockaddr结构而不是一个地址队列 二.函数原型 #include <netdb.h> int getaddrinfo(const char *hostname, const char *service, const struct addrinfo *hints, struct addrinfo **reesult); 返回:成功为0,出错为非0 (1)hostname:是一个主机名或地址串 (…
1.TCP/IP协议概述 1.1.OSI参考模型及TCP/IP参考模型 OSI协议参考模型是基于国际标准化组织(ISO)的建议发展起来的,从上到下工分为7层:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层.与此相区别的TCP/IP协议模型一开始就遵循简单明确的设计思路,它将OSI的7层参考模型简化为4层,从而得到有利于实现和使用.TCP/IP协议参考模型和OSI协议参考模型的对应关系如下图所示: 网络接口层:负责将二进制流转换为数据帧,并进行数据帧的发送和接收.要注意的是数据帧是独立…
Socket的地址查询函数 http://blog.sina.com.cn/s/blog_988c054b010139e3.html http://www.cnblogs.com/cxz2009/archive/2010/11/19/1881693.html 包含头文件#include<netdb.h> 函数原型int getaddrinfo( const char *hostname, const char *service, const struct addrinfo *hints, st…
一.用数值表示socket地址&用名字表示socket地址(socket地址==>IP地址和端口号) 1. 用数值表示socket地址不便于记忆,也不便于扩展(比如从IPv4转移到IPv6) 2. 用名字表示socket地址意味着用主机名代替IP地址,用服务名称代替端口号 我们可以用主机名来访问一台机器,而避免直接使用其IP地址.同样,我们用服务名称来代替端口号. 所以,下面两条telnet命令具有完全相同的作用: telnet telnet  localhost  www 二.实现主机名&…
#include <sys/socket.h> #include <netdb.h> int getaddrinfo(const char *restrict nodename, /* host 或者IP地址 */ const char *restrict servname, /* 十进制端口号 或者常用服务名称如"ftp"."http"等 */ const struct addrinfo *restrict hints, /* 获取信息要求…
网络服务器通常使用一个独立的进程或线程来实现每个连接.由于高性能应用程序需要同时处理大量的客户端,这种方法就不太好用了,因为资源占用和上下文切换时间等因素影响了同时处理大量客户端的能力.另一种方法是在一个线程中使用非阻塞 I/O,以及一些就绪通知方法,即当你可以在一个套接字上读写更多数据的时候告诉你. 本文介绍了 Linux 的 epoll(7) 机制,它是 Linux 最好的就绪通知机制.我们用 C 语言编写了示例代码,实现了一个完整的 TCP 服务器. 我假设您有一定 C 语言编程经验,知道…
概述 在名字和数值地址间进行转换的函数: gethostbyname和gethostbyaddr:在主机名字与IPv4地址之间进行转换.仅仅支持IPv4. getservbyname和getservbyport:在服务名字和端口号之间进行转换. getaddrinfo和getnameinfo:用于主机名字和IP地址之间以及服务名字和端口号之间的转换.(这两个函数是协议无关的) 域名系统 域名系统(Domain Name System,简称DNS)主要用于主机名字和IP地址之间的映射. 资源记录…
IPv4中使用gethostbyname()函数完成主机名到地址解析,但是该API不允许调用者指定所需地址类型的任何信息,返回的结构只包含 了用于存储IPv4地址的空间.为了解决该问题,IPv6中引入了getaddrinfo()的新API,它是协议无关的,既可用于IPv4也可用于 IPv6.调用该函数会获得一个addrinfo结构的列表,调用的返回值是addrinfo的结构(列表)指针. 本文结合在WinowsXP和Windows2003 Server上使用该函数的经验,对getaddrinfo…
介绍套接字之前,我们先看一下传输层的协议TCP与UDP: TCP协议与UDP协议的区别 首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UDP协议的 区别,我觉得这是没有从本质上弄清楚网络通信! TCP/IP协议是一个协议簇.里面包括很多协议的.UDP只是其中的一个.之所以命名为TCP/IP协议,因为TCP,IP协议是 两个很重要的协议,就用他两命名了. TCP/IP协议集包括应用层,传输层,网络层,网络访问层. 其中应用层包括: 超文…