linux - webench源码中gethostbyname使用问题
问题描述
inaddr = inet_addr(host);
if (inaddr != INADDR_NONE)
memcpy(&ad.sin_addr, &inaddr, sizeof(inaddr));
else
{
hp = gethostbyname(host);
if (hp == NULL)
return -1;
//does not have h_addr member
memcpy(&ad.sin_addr, hp->h_addr, hp->h_length);
}
我是网络编程新手,我的一个朋友告诉我阅读webench的代码来学习基本使用。我看到这本书unp,发现struct hostent没有h_addr的成员,在书中的例子表明h_aliases和h_addrtype 是指向指针的指针,这意味着我们可以这样使用:
#include "unp.h"
int
main(int argc, char **argv)
{
char *ptr, **pptr;
char str[INET_ADDRSTRLEN];
struct hostent *hptr;
while (--argc > 0) {
ptr = *++argv;
if ( (hptr = gethostbyname(ptr)) == NULL) {
err_msg("gethostbyname error for host: %s: %s",
ptr, hstrerror(h_errno));
continue;
}
printf("official hostname: %s\n", hptr->h_name);
for (pptr = hptr->h_aliases; *pptr != NULL; pptr++)
printf("\talias: %s\n", *pptr);
switch (hptr->h_addrtype) {
case AF_INET:
pptr = hptr->h_addr_list;
for ( ; *pptr != NULL; pptr++)
printf("\taddress: %s\n",
Inet_ntop(hptr->h_addrtype, *pptr, str, sizeof(str)));
break;
default:
err_ret("unknown address type");
break;
}
}
exit(0);
}
我怎样才能将其修改为正确的代码,因为 h_addr_list 可能有多个 ipaddr,我应该将哪个值复制到 ad.sin_addr。
解决方案
推荐阅读
- powershell - 在计算属性中调用哈希表
- javascript - 找不到 require.js,不断收到 Uncaught SyntaxError: Unexpected token '<'
- jmeter - 在 Jmeter 的分布式负载测试中处理唯一的 CSV 数据,只有 Master 中的测试数据
- css - 使用组元素旋转 SVG 圆
- javascript - 从 React Native 中的另一个文件导入大型数据集
- api - 如何过滤 RESTful 集合资源?查询参数还是查询字符串?
- javascript - JavaScript 单线程性能受到其他内核负载的强烈影响
- c# - 如何删除注册表中名称中带有 Bachslash(\) 的子键?
- typescript - 如何仅允许作为同一对象中另一个属性中的键的属性
- c++ - 关于类模板成员的显式特化的混淆