为什么使用getaddrinfo()函数
2013-01-10 18:56
363 查看
在IPv6的应用中getaddrinfo()是很常见的,最常见的形式是:
我们需要的变量是“addrinfo *res”,而hints只是一个中间过程而已。但仔细观察下,我们会发现,相比于hints变量,res也只是增加了IP地址和端口信息而已,并没有其他更多的信息加入。这时候便会有人有疑问:“为什么不像变量hints一样,直接把IP地址和端口直接指定呢?为什么非要绕个弯弯呢?”其实,我在最开始的时候也存在这样的疑问,下面让我们在看一下res在后续程序中被用到的地方。
但这里貌似没什么特别的(相比于hints而言)。
接着看,
注意这里的res->ai_addrlen。这个变量代表地址长度。是在getaddrinfo()函数中自动获得的(当然这个我们也可以自己指定)。
看到这里,应用getaddrinfo()函数的原因已经很明显了-简化res变量的初始化。老实讲,数据类型addrinfo还是有点小复杂的(有兴趣可以研究下),如果每一个内部数据成员都要考虑初始化,还是相对麻烦的。所以,这里引入getaddrinfo()函数,使得addrinfo res的初始化变得清晰而简单。
需要补充的是,getaddrinfo()函数的用途也不只限于此的,至少它的本意是获得所有符合条件的addrinfo类型列表的。
addrinfo hints; addrinfo *res = NULL; memset(&hints,0,sizeof(hints)); hints.ai_family=AF_INET6; hints.ai_socktype=SOCK_DGRAM; hints.ai_protocol=IPPROTO_UDP; hints.ai_flags=AI_NUMERICHOST; int rc=getaddrinfo((LPCTSTR)"2001:da8:6000:291:21f:d0ff:fed4:928c","6000",&hints,&res);
我们需要的变量是“addrinfo *res”,而hints只是一个中间过程而已。但仔细观察下,我们会发现,相比于hints变量,res也只是增加了IP地址和端口信息而已,并没有其他更多的信息加入。这时候便会有人有疑问:“为什么不像变量hints一样,直接把IP地址和端口直接指定呢?为什么非要绕个弯弯呢?”其实,我在最开始的时候也存在这样的疑问,下面让我们在看一下res在后续程序中被用到的地方。
SOCKET sockSrv=socket(res->ai_family, res->ai_socktype, res->ai_protocol);
但这里貌似没什么特别的(相比于hints而言)。
接着看,
int ret = bind(sockSrv, res->ai_addr, res->ai_addrlen); char bufSend[50] = "safasf"; rc=sendto(sockClt, bufSend, 4, 0, res->ai_addr,res->ai_addrlen);
注意这里的res->ai_addrlen。这个变量代表地址长度。是在getaddrinfo()函数中自动获得的(当然这个我们也可以自己指定)。
看到这里,应用getaddrinfo()函数的原因已经很明显了-简化res变量的初始化。老实讲,数据类型addrinfo还是有点小复杂的(有兴趣可以研究下),如果每一个内部数据成员都要考虑初始化,还是相对麻烦的。所以,这里引入getaddrinfo()函数,使得addrinfo res的初始化变得清晰而简单。
需要补充的是,getaddrinfo()函数的用途也不只限于此的,至少它的本意是获得所有符合条件的addrinfo类型列表的。
相关文章推荐
- 为什么使用getaddrinfo()函数
- 驱动: 中断【3】为什么可能导致睡眠的函数都不能在中断上下文中使用呢?
- unix网络编程之getaddrinfo函数详解及使用举例
- 为什么在定义能够使用函数适配器的函数的时候要继承一下std::unary_function或者std::binary_function
- 为什么在php不推荐使用mysql_*的函数?
- 在使用Fake framework的时候,为什么有一些函数没有生产mock呢?
- 1.4b为什么使用函数,如何高效地使…
- 从汇编的角度理解为什么c样式函数使用时,实参尽量使用指针传递
- 为什么通过AIDL方式使用binder机制的时候如果Bn端函数比较耗时Bp端会ANR
- 为什么可能导致睡眠的函数都不能在中断上下文中使用呢?
- 为什么可能导致睡眠的函数都不能在中断上下文中使用呢?【转】
- 在c++程序中调用被C编译器编译后的函数,为什么要使用extern “C”
- Python 为什么要使用函数
- 为什么不在你的下一个函数库中使用 Library GPL
- c++如何使用c中的函数,为什么?
- 为什么要使用GetSafeHwnd()函数
- 为什么linuxC程序设计中不能使用system("cd ..")来改变当前工作路径而用chdir()函数
- itoa为什么成了不赞成使用的函数了?
- 为什么使用CreateThread时不建议调用RTC函数
- 为什么在C++使用pthread_create()的时候,类成员函数做线程的处理函数必须要定义成static类型的?