主机名和网络名查询
来源:百度文库 编辑:神马文学网 时间:2024/04/28 08:24:34
单日志页面显示设置
网易首页
网易博客博客首页
博客拍拍
精美风格
博客圈子
博客活动
娱乐中心
博客话题
找 朋 友
博客复制
手机博客
短信写博
意见反馈
更多>>
搜 索
登录|注册
',1)">
聪聪向萌
俺们这旮沓是东北
首页
日志
相册
音乐
收藏
博友
关于我
很抱歉,因为您在网易相册发布了违规信息,账号被屏蔽。被屏蔽期间他人无法访问您的相册。
去帮助中心,了解如何重新恢复服务。
日志
引用 socket编程之套接口绑定地址引用 socket编程之面向连接的协议──客户端
引用 socket编程之主机名和网络名查询
linux学习 2009-04-17 08:27 阅读38 评论0
字号:大大 中中 小
引用
木子木南 的socket编程之主机名和网络名查询
第九章 主机名和网络名查询
一、函数说明:
1)uname(2)
说明:
可以告诉程序关于系统的信息。
原型:
#include
int uname(struct utsname *buf)
参数:
struct utsname
{
char sysname[SYS_NMLN]; //使用的操作系统名,如:linux
char nodename[SYS_NMLN]; //网络结点主机名
char release[SYS_NMLN]; //操作系统的发布,如:linux内核为2.2.10,则为"2.2.10"
char version[SYS_NMLN]; //操作系统的版本,对于linux代表内核版本,日期
char machine[SYS_NMLN]; //主机的硬件类型,如i386
char domainname[SYS_NMLN]; //主机的NIS/YP域名
}
返回值:
调用成功:0,失败:-1,错误原因记录在errno中
实例见:p155.c
注:对于NIS/YP的解释:http://www.freebsd.org/doc/zh_CN/books/handbook/network-nis.html
2)gethostname(2)
说明:
获取当前的主机名
原型:
#include
int gethostname(char *name, size_t len)
参数:
name:用于接收的缓冲区name
len:接收缓冲区的最大长度
返回值:
调用成功:0,失败:-1,错误原因记录在errno中
3)getdomainname(2)
说明:
获取当前的主机的NIS域名
原型:
#include
int getdomainname(char *name, size_t len)
参数:
name:用于接收的缓冲区name
len:接收缓冲区的最大长度
返回值:
调用成功:0,失败:-1,错误原因记录在errno中。实际上其内部是调用uname(2)函数以获取NIS域名的。
实例见:p158.c
4)h_errno错误报告
在下面几个函数中的错误信息不再使用errno,而是使用h_errno,注意!!h_errno有一个缺陷,它不能被现一个进程的多个线程共享,虽然errno对于线程是安全的,但是h_errno是不行的。
原型:
#include
extern int h_errno;
void herror(const char *msg);
const char *hstrerror(int err);
其中herror(3)与perror(3)非常相似,但它是一个过时的函数。
hstrerror(3)与strerror(3)相似,返回一个指向响应错误说明的文本消息的指针
h_errno码表
错误码 值 描述
NETDB_SUCCESS 0 成功,没有错误
HOST_NOT_FOUND 1 指定的主机名未知
TRY_AGAIN 2 在名字服务器上发生了临时错误,稍后再试
NO_RECOVERY 3 发生了一个不可恢复的名字服务器错误
NO_DATA 4 指定的主机名有效,但没有IP地址
NO_ADDRESS 同上
5)gethostbyname(3)
说明:
通过主机名得到它的IP地址。
原型:
#include
extern int h_errno;
struct hostent *gethostbyname(const char *name);
struct hostent
{
char h_name; //主机的官方名
char **h_aliases; //别名清单
int h_addrtype; //主机地址类型:IPv4时为AF_INET,IPv6时为AF_INET6
int h_length; //地址长度与h_addrtype有关,IPv4时
char **h_addr_list;//地址清单
};
//保持向后的兼容性
#define h_addr h_addr_list[0]
实例:p163.c
6)gethostbyaddr(3)
说明:
它取一个二进制的IP地址并试图找到与此地址相匹配的主机名
原型:
#include
struct hostent *gethostbyaddr(const char *addr, int len, int type)
参数:
addr:需要的主机名,对于AF_INET地址类型,这是一个指向地址结构中sin_addr成员的指针。
len:地址长度,对于AF_INET长度4字节,对于AF_INET6,长度为16字节。
type:输入地址类型,为AF_INET或AF_INET6
实例:p166.c
7)sethostent(3)
说明:
允许对名字服务器的查询进行控制这可以大大改善程序的网络性能。
原型:
#include
void sethostent(int stayopen)
参数:
stayopen:这是一个布尔型变量,即0或非0
当为真时,名字服务器的查询将通过TCP/IP套接口进行,且该套接口将保持打开状态
当为假时,名字服务器的查询将通过UDP数据报进行
8)endhostent(3)
当sethostent以TRUE方式调用时,当不再需要进行名字服务器查询,为了节约资源,用这个函数终止与服务器的连接,释放TCP/IP套接口
原型:
#include
void endhostent(void)
p155.c
//uname()示例
#include
#include
#include
#include
#include
#include
int main(int argc, char *argv[])
...{
int z;
struct utsname u_name;
z = uname(&u_name);
if (-1 == z)
...{
fprintf(stderr, "%s, uname() ", strerror(errno));
exit(1);
}
printf(" sysname[] = '%s'; ", u_name.sysname);
printf(" nodename[] = '%s'; ", u_name.nodename);
printf(" release[] = '%s'; ", u_name.release);
printf(" version[] = '%s'; ", u_name.version);
printf(" machine[] = '%s'; ", u_name.machine);
printf(" domainname[] = '%s'; ", u_name.__domainname);
//在书上本是u_name.domainname但是在ubuntu中只能用__domainname,可以看一下sys/utsname.h
}
p158.c
/**/////gethostname() getdomainname()示例
#include
#include
#include
#include
#include
int main(int argc, char *argv[])
...{
int z;
char buf[32];
z = gethostname(buf, sizeof(buf));
if (-1 == z)
...{
fprintf(stderr, "%s: gethostname() ", strerror(errno));
exit(1);
}
printf("host name = '%s' ", buf);
z = getdomainname(buf, sizeof(buf));
if (-1 == z)
...{
fprintf(stderr, "%s: getdomainname() ", strerror(errno));
exit(1);
}
printf("domain name = '%s' ", buf);
return 0;
}
p163.c
//gethostbyname()
//运行:./a.out www.163.com
#include
#include
#include
#include
#include
#include
#include
#include
#include
extern int h_errno;
int main(int argc, char *argv[])
...{
int x, x2;
struct hostent *hp;
for (x = 1; x < argc; ++x)
...{
hp = gethostbyname(argv[x]);
if (!hp)
...{
fprintf(stderr, "%s: host '%s' ", hstrerror(h_errno), argv[x]);
continue;
}
printf("Host %s: ", argv[x]);
printf(" Officially: %s ", hp->h_name);
fputs(" tAliases: ", stdout);
for (x2 = 0; hp->h_aliases[x2]; ++x2)
...{
if (x2)
fputs(", ", stdout);
fputs(hp->h_aliases[x2], stdout);
}
fputc(' ', stdout);
printf(" Type: %s ", hp->h_addrtype == AF_INET
? "AF_INET" : "AF_INET6");
if (AF_INET == hp->h_addrtype)
...{
for (x2 = 0; hp->h_addr_list[x2]; ++x2)
printf(" Address: %s ",
inet_ntoa(*(struct in_addr *)hp->h_addr_list[x2]));
}
putchar(' ');
}
return 0;
}
p166.c
/**//*
gethostbyaddr()实例
修改../no.8/server.c代码(TCP/IP服务器程序),客户端是../no.8/client.c
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
static void bail(const char *on_what)
...{
if (errno != 0)
...{
fputs(strerror(errno), stderr);
fputs(":",stderr);
}
fputs(on_what, stderr);
fputc(' ', stderr);
exit(1);
}
int main(int argc, char *argv[])
...{
int z;
char *srvr_addr = NULL;
char *srvr_port = "9099";
struct sockaddr_in adr_srvr;
struct sockaddr_in adr_clnt;
socklen_t len_inet;
int s;
int c;
int n;
time_t td;
char dtbuf[128];
FILE *logf;
struct hostent *hp;
if (!(logf = fopen("srvr2.log", "w")))
bail("fopen(3)");
if (argc >= 2)
...{
srvr_addr = argv[1];
}else
...{
srvr_addr = "127.0.0.1";
}
if (argc >= 3)
srvr_port = argv[2];
s = socket(PF_INET, SOCK_STREAM, 0);
if (-1 == s)
bail("socket()");
memset(&adr_srvr, 0, sizeof(adr_srvr));
adr_srvr.sin_family = AF_INET;
adr_srvr.sin_port = htons(atoi(srvr_port));
if (strcmp(srvr_addr, "*") != 0)
...{
adr_srvr.sin_addr.s_addr = inet_addr(srvr_addr);
if (adr_srvr.sin_addr.s_addr == INADDR_NONE)
bail("bad address");
}else
...{
adr_srvr.sin_addr.s_addr = INADDR_ANY;
}
len_inet = sizeof(adr_srvr);
z = bind(s, (struct sockaddr *)&adr_srvr, len_inet);
if (-1 == z)
bail("bind()");
z = listen(s, 10);
if (-1 == z)
bail("listen()");
for (;;)
...{
len_inet = sizeof(adr_clnt);
c = accept(s, (struct sockaddr *)&adr_clnt, &len_inet);
if (-1 == c)
bail("accept()");
fprintf(logf, "Client %s:", inet_ntoa(adr_clnt.sin_addr));
hp = gethostbyaddr((char *)&adr_clnt.sin_addr, sizeof(adr_clnt.sin_addr), adr_clnt.sin_family);
if (!hp)
fprintf(logf, "Error: %s ", hstrerror(h_errno));
else
fprintf(logf, "%s ", hp->h_name);
fflush(logf);
time(&td);
n = (int)strftime(dtbuf, sizeof(dtbuf),
"%A %b %d %H:%M:%S %Y ", localtime(&td));
z = write(c, dtbuf, n);
if (-1 == z)
bail("write()");
close(c);
}
return 0;
}
有0人推荐
举报
引用(0)
评论(0)
阅读(38)
上一篇:引用 socket编程之面向连接的协议──客户端
下一篇:引用 socket编程之套接口绑定地址
评论
点击登录 |昵称:
《反低俗,文明上网通告》
tom_hancong
东北人的豪爽!!
加博友 关注他
最新日志
Qmake在QT中的使用
Visual Studio 2008 快捷键大全
图形旋转问题
C代码优化方案(转)(2008-3-27 16:37:00)
visual 2008中error PRJ0003 : 生成 cmd.exe 时出错”
引用 wince6.0安装
公司简介-联系方法-招聘信息-客户服务-相关法律-
网易公司版权所有 ©1997-2009
JSWindow
正在加载中...
欢迎通过百度搜索来到tom_hancong的博客!
注册登录后,你也可以拥有自己的个人博客,
还可以和博友更好的交流。 网易博客欢迎你的加入!
请输入网易通行证用户名和密码登录
用户名:
密码:
网易首页
网易博客博客首页
博客拍拍
精美风格
博客圈子
博客活动
娱乐中心
博客话题
找 朋 友
博客复制
手机博客
短信写博
意见反馈
更多>>
搜 索
登录|注册
',1)">
聪聪向萌
俺们这旮沓是东北
首页
日志
相册
音乐
收藏
博友
关于我
很抱歉,因为您在网易相册发布了违规信息,账号被屏蔽。被屏蔽期间他人无法访问您的相册。
去帮助中心,了解如何重新恢复服务。
日志
引用 socket编程之套接口绑定地址引用 socket编程之面向连接的协议──客户端
引用 socket编程之主机名和网络名查询
linux学习 2009-04-17 08:27 阅读38 评论0
字号:大大 中中 小
引用
木子木南 的socket编程之主机名和网络名查询
第九章 主机名和网络名查询
一、函数说明:
1)uname(2)
说明:
可以告诉程序关于系统的信息。
原型:
#include
int uname(struct utsname *buf)
参数:
struct utsname
{
char sysname[SYS_NMLN]; //使用的操作系统名,如:linux
char nodename[SYS_NMLN]; //网络结点主机名
char release[SYS_NMLN]; //操作系统的发布,如:linux内核为2.2.10,则为"2.2.10"
char version[SYS_NMLN]; //操作系统的版本,对于linux代表内核版本,日期
char machine[SYS_NMLN]; //主机的硬件类型,如i386
char domainname[SYS_NMLN]; //主机的NIS/YP域名
}
返回值:
调用成功:0,失败:-1,错误原因记录在errno中
实例见:p155.c
注:对于NIS/YP的解释:http://www.freebsd.org/doc/zh_CN/books/handbook/network-nis.html
2)gethostname(2)
说明:
获取当前的主机名
原型:
#include
int gethostname(char *name, size_t len)
参数:
name:用于接收的缓冲区name
len:接收缓冲区的最大长度
返回值:
调用成功:0,失败:-1,错误原因记录在errno中
3)getdomainname(2)
说明:
获取当前的主机的NIS域名
原型:
#include
int getdomainname(char *name, size_t len)
参数:
name:用于接收的缓冲区name
len:接收缓冲区的最大长度
返回值:
调用成功:0,失败:-1,错误原因记录在errno中。实际上其内部是调用uname(2)函数以获取NIS域名的。
实例见:p158.c
4)h_errno错误报告
在下面几个函数中的错误信息不再使用errno,而是使用h_errno,注意!!h_errno有一个缺陷,它不能被现一个进程的多个线程共享,虽然errno对于线程是安全的,但是h_errno是不行的。
原型:
#include
extern int h_errno;
void herror(const char *msg);
const char *hstrerror(int err);
其中herror(3)与perror(3)非常相似,但它是一个过时的函数。
hstrerror(3)与strerror(3)相似,返回一个指向响应错误说明的文本消息的指针
h_errno码表
错误码 值 描述
NETDB_SUCCESS 0 成功,没有错误
HOST_NOT_FOUND 1 指定的主机名未知
TRY_AGAIN 2 在名字服务器上发生了临时错误,稍后再试
NO_RECOVERY 3 发生了一个不可恢复的名字服务器错误
NO_DATA 4 指定的主机名有效,但没有IP地址
NO_ADDRESS 同上
5)gethostbyname(3)
说明:
通过主机名得到它的IP地址。
原型:
#include
extern int h_errno;
struct hostent *gethostbyname(const char *name);
struct hostent
{
char h_name; //主机的官方名
char **h_aliases; //别名清单
int h_addrtype; //主机地址类型:IPv4时为AF_INET,IPv6时为AF_INET6
int h_length; //地址长度与h_addrtype有关,IPv4时
char **h_addr_list;//地址清单
};
//保持向后的兼容性
#define h_addr h_addr_list[0]
实例:p163.c
6)gethostbyaddr(3)
说明:
它取一个二进制的IP地址并试图找到与此地址相匹配的主机名
原型:
#include
struct hostent *gethostbyaddr(const char *addr, int len, int type)
参数:
addr:需要的主机名,对于AF_INET地址类型,这是一个指向地址结构中sin_addr成员的指针。
len:地址长度,对于AF_INET长度4字节,对于AF_INET6,长度为16字节。
type:输入地址类型,为AF_INET或AF_INET6
实例:p166.c
7)sethostent(3)
说明:
允许对名字服务器的查询进行控制这可以大大改善程序的网络性能。
原型:
#include
void sethostent(int stayopen)
参数:
stayopen:这是一个布尔型变量,即0或非0
当为真时,名字服务器的查询将通过TCP/IP套接口进行,且该套接口将保持打开状态
当为假时,名字服务器的查询将通过UDP数据报进行
8)endhostent(3)
当sethostent以TRUE方式调用时,当不再需要进行名字服务器查询,为了节约资源,用这个函数终止与服务器的连接,释放TCP/IP套接口
原型:
#include
void endhostent(void)
p155.c
//uname()示例
#include
#include
#include
#include
#include
#include
int main(int argc, char *argv[])
...{
int z;
struct utsname u_name;
z = uname(&u_name);
if (-1 == z)
...{
fprintf(stderr, "%s, uname() ", strerror(errno));
exit(1);
}
printf(" sysname[] = '%s'; ", u_name.sysname);
printf(" nodename[] = '%s'; ", u_name.nodename);
printf(" release[] = '%s'; ", u_name.release);
printf(" version[] = '%s'; ", u_name.version);
printf(" machine[] = '%s'; ", u_name.machine);
printf(" domainname[] = '%s'; ", u_name.__domainname);
//在书上本是u_name.domainname但是在ubuntu中只能用__domainname,可以看一下sys/utsname.h
}
p158.c
/**/////gethostname() getdomainname()示例
#include
#include
#include
#include
#include
int main(int argc, char *argv[])
...{
int z;
char buf[32];
z = gethostname(buf, sizeof(buf));
if (-1 == z)
...{
fprintf(stderr, "%s: gethostname() ", strerror(errno));
exit(1);
}
printf("host name = '%s' ", buf);
z = getdomainname(buf, sizeof(buf));
if (-1 == z)
...{
fprintf(stderr, "%s: getdomainname() ", strerror(errno));
exit(1);
}
printf("domain name = '%s' ", buf);
return 0;
}
p163.c
//gethostbyname()
//运行:./a.out www.163.com
#include
#include
#include
#include
#include
#include
#include
#include
#include
extern int h_errno;
int main(int argc, char *argv[])
...{
int x, x2;
struct hostent *hp;
for (x = 1; x < argc; ++x)
...{
hp = gethostbyname(argv[x]);
if (!hp)
...{
fprintf(stderr, "%s: host '%s' ", hstrerror(h_errno), argv[x]);
continue;
}
printf("Host %s: ", argv[x]);
printf(" Officially: %s ", hp->h_name);
fputs(" tAliases: ", stdout);
for (x2 = 0; hp->h_aliases[x2]; ++x2)
...{
if (x2)
fputs(", ", stdout);
fputs(hp->h_aliases[x2], stdout);
}
fputc(' ', stdout);
printf(" Type: %s ", hp->h_addrtype == AF_INET
? "AF_INET" : "AF_INET6");
if (AF_INET == hp->h_addrtype)
...{
for (x2 = 0; hp->h_addr_list[x2]; ++x2)
printf(" Address: %s ",
inet_ntoa(*(struct in_addr *)hp->h_addr_list[x2]));
}
putchar(' ');
}
return 0;
}
p166.c
/**//*
gethostbyaddr()实例
修改../no.8/server.c代码(TCP/IP服务器程序),客户端是../no.8/client.c
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
static void bail(const char *on_what)
...{
if (errno != 0)
...{
fputs(strerror(errno), stderr);
fputs(":",stderr);
}
fputs(on_what, stderr);
fputc(' ', stderr);
exit(1);
}
int main(int argc, char *argv[])
...{
int z;
char *srvr_addr = NULL;
char *srvr_port = "9099";
struct sockaddr_in adr_srvr;
struct sockaddr_in adr_clnt;
socklen_t len_inet;
int s;
int c;
int n;
time_t td;
char dtbuf[128];
FILE *logf;
struct hostent *hp;
if (!(logf = fopen("srvr2.log", "w")))
bail("fopen(3)");
if (argc >= 2)
...{
srvr_addr = argv[1];
}else
...{
srvr_addr = "127.0.0.1";
}
if (argc >= 3)
srvr_port = argv[2];
s = socket(PF_INET, SOCK_STREAM, 0);
if (-1 == s)
bail("socket()");
memset(&adr_srvr, 0, sizeof(adr_srvr));
adr_srvr.sin_family = AF_INET;
adr_srvr.sin_port = htons(atoi(srvr_port));
if (strcmp(srvr_addr, "*") != 0)
...{
adr_srvr.sin_addr.s_addr = inet_addr(srvr_addr);
if (adr_srvr.sin_addr.s_addr == INADDR_NONE)
bail("bad address");
}else
...{
adr_srvr.sin_addr.s_addr = INADDR_ANY;
}
len_inet = sizeof(adr_srvr);
z = bind(s, (struct sockaddr *)&adr_srvr, len_inet);
if (-1 == z)
bail("bind()");
z = listen(s, 10);
if (-1 == z)
bail("listen()");
for (;;)
...{
len_inet = sizeof(adr_clnt);
c = accept(s, (struct sockaddr *)&adr_clnt, &len_inet);
if (-1 == c)
bail("accept()");
fprintf(logf, "Client %s:", inet_ntoa(adr_clnt.sin_addr));
hp = gethostbyaddr((char *)&adr_clnt.sin_addr, sizeof(adr_clnt.sin_addr), adr_clnt.sin_family);
if (!hp)
fprintf(logf, "Error: %s ", hstrerror(h_errno));
else
fprintf(logf, "%s ", hp->h_name);
fflush(logf);
time(&td);
n = (int)strftime(dtbuf, sizeof(dtbuf),
"%A %b %d %H:%M:%S %Y ", localtime(&td));
z = write(c, dtbuf, n);
if (-1 == z)
bail("write()");
close(c);
}
return 0;
}
有0人推荐
举报
引用(0)
评论(0)
阅读(38)
上一篇:引用 socket编程之面向连接的协议──客户端
下一篇:引用 socket编程之套接口绑定地址
评论
点击登录 |昵称:
《反低俗,文明上网通告》
tom_hancong
东北人的豪爽!!
加博友 关注他
最新日志
Qmake在QT中的使用
Visual Studio 2008 快捷键大全
图形旋转问题
C代码优化方案(转)(2008-3-27 16:37:00)
visual 2008中error PRJ0003 : 生成 cmd.exe 时出错”
引用 wince6.0安装
公司简介-联系方法-招聘信息-客户服务-相关法律-
网易公司版权所有 ©1997-2009
JSWindow
正在加载中...
欢迎通过百度搜索来到tom_hancong的博客!
注册登录后,你也可以拥有自己的个人博客,
还可以和博友更好的交流。 网易博客欢迎你的加入!
请输入网易通行证用户名和密码登录
用户名:
密码:
主机名和网络名查询
如何在ubuntu下更改主机名/更改ubuntu电脑名
网络查询
linux 主机名
实用网络查询
网络查询很方便
网络查询大全
药品和疾病查询
最全的网络在线查询
【网络查询工具大全】(包罗万有 无所不及)
万年历和天气预报即时查询!
药品大全和疾病查询'''
和讯股票个股查询
用Tomcat建立基于主机名的虚拟主机
[游记]甘肃四大名镇之:碧口镇,票价查询
如何确定网页和查询的相关性
万年历和天气预报即时查询!【很实用】
中西医-药品大全和疾病查询
药品大全和疾病查询1
医药:药品大全和疾病查询
健康:药品大全和疾病查询
网络最全的“驾车知识”查询大全
网络信息:宏观经济、经济学人----24名
母亲的声音(网络名文)