gethostname、gethostbyname
gethostname():返回本地主机的标准主机名
原型:
#include<unistd.h> int gethostname(char *name, size_t len);
参数说明:
name: 接收缓冲区,字节长度必须为len,或更长,存获取主机名
len: 接收缓冲区name的最大长度
返回值:
如果函数成功,返回0,如果发生错误,返回-1,错误号存放在外部变量errno中。
/*
gethostname.c
*/
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h> #define ERR_EXIT(m) \
do {\
perror(m); \
exit(EXIT_FAILURE); \
}while(); int main()
{
char name[];
if (gethostname(name, sizeof(name)))
{
ERR_EXIT("gethostname");
} printf("hostname = %s\n",name); return ;
}
运行结果:
gethostbyname()
函数原型:
#include <netdb.h>
#include <sys/socket.h>
struct hostent *gethostbyname(const char *name);
参数说明:
name:域名或主机名
返回值:
调用成功,返回一个hostent结构,若函数调用失败,返回NULL
返回的hostent结构体类型的指针:
struct hostent { char *h_name; /* official name of host */
char **h_aliases; /*alias list */
int h_addrtype; /* host address type */
int h_length; /* length of address */
char **h_addr_list; /* list of addresses*/ } #define h_addr h_addr_list[0] /* for backward compatibility */
hostent->h_name
表示的是主机的规范名。例如www.google.com的规范名其实是www.l.google.com.
hostent->h_aliases
表示的是主机的别名www.google.com就是google他自己的别名。有的时候,有的主机可能有好几个别名,这些,其实都是为了易于用户记忆而为自己的网站多取的名字。
hostent->h_addrtype
表示的是主机ip地址的类型,到底是ipv4(AF_INET),还是ipv6(AF_INET6)
hostent->h_length
表示的是主机ip地址的长度
hostent->h_addr_list
表示的是主机的ip地址,注意,这个是网络字节存储的。千万不要直接用printf带%s参数来打这个东西,会有问题的哇。所以到真正需要打印出这个IP的话,需要调用inet_ntop()。
const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt);
这个函数,是将类型为af的网络地址结构src,转换为主机序的字符串形式,存放在长度为cnt的字符串中。返回指向dst的一个指针。如果函数调用错误,返回值是NULL。
/*
gethostbyname.c
*/
#include<stdio.h>
#include<netdb.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<sys/socket.h> int main()
{
char name[];
gethostname(name,sizeof(name));
printf("hostname = %s\n",name); struct hostent *hp;
if ((hp = gethostbyname(name)) == NULL)
{
printf("gethostbyname error");
} int i = ;
while(hp->h_addr_list[i] != NULL)
{
printf("hostname : %s\n",hp->h_name);
printf("\tip:%s\n",inet_ntoa(*(struct in_addr*)hp->h_addr_list[i]));
i++;
}
return ;
}
运行结果:
gethostname、gethostbyname的更多相关文章
- 关于 getsockname、getpeername和gethostname、gethostbyname
一.gethostname,gethostbyname的用法 这两个函数可以用来获取主机的信息.gethostname:获取主机的名字gethostbyname:通过名字获取其他的信息(比如ip) 1 ...
- gethostname(获取主机名)、gethostbyname(由主机名获取IP地址)
int gethostname(char *name, size_t len);获取本地主机名存入name[len],成功返回0,失败返回-1: struct hostent * gethostbyn ...
- socket编程基础1——hostent、in_addr、gethostbyname、inet_ntoa
1. struct hostent结构体 struct hostent { char *h_name; char **h_aliases; int h_addrtype; int h_length; ...
- 一个进程发起多个连接和gethostbyname等函数
一.在前面讲过的最简单的回射客户/服务器程序中,一个客户端即一个进程,只会发起一个连接,只要稍微修改一下就可以让一个客户端发起多个连 接,然后只利用其中一个连接发送数据. 先来认识一个函数getsoc ...
- 【网络基础编程】第三节 C/S
学习地址: C语言中文网 - 实现迭代服务端和客户端 GNU - Closing a Socket 前面介绍的程序,不管Service 端还是 Client端,都有一个问题,就是处理完一个 accep ...
- 用C++实现网络编程---抓取网络数据包的实现方法
一般都熟悉sniffer这个工具,它可以捕捉流经本地网卡的所有数据包.抓取网络数据包进行分析有很多用处,如分析网络是否有网络病毒等异常数据,通信协议的分析(数据链路层协议.IP.UDP.TCP.甚至各 ...
- VC++ 获取本地IP和计算机名
主要是两个函数的使用,gethostname();.gethostbyname(); 自定义两个函数GetLocalHostName获取计算机名.GetIPAddress获取IP地址 int CIPD ...
- vc根据域名获取IP地址 gethostbyname()函数
以下是VC Socket初始化时用到的两个函数 一.WSAStartup函数 int WSAStartup ( ...
- Linux 获取本机IP、MAC地址用法大全
getifaddrs()和struct ifaddrs的使用,获取本机IP ifaddrs结构体定义如下: struct ifaddrs { struct ifaddrs *ifa_next; /* ...
随机推荐
- Authentication using SASL/Kerberos
Prerequisites KerberosIf your organization is already using a Kerberos server (for example, by using ...
- LINUX 下.NET Core 微服务部署实战
前言 最近一直在开发部署.也没有总结一下.从5月份开始出差到现在基本没有发过博客,哎,惭愧. 一直在弄微服务,后续会慢慢更新下面这个系列.欢迎各位大佬交流指点. 分布式理论专题 1..net core ...
- ASP.NET SignalR 系列(七)之服务端触发推送
前面几章讲的都是从客户端触发信息推送的,但在实际项目中,很多信息可能是由系统服务端推送的,下面2图分别展示两种通道 客户端触发推送 服务端推送 下面我们就重点介绍下服务端如何调用集线器的对象进行推送 ...
- Weyland-Energy 说明
Weyland-Energy 说明 品名:Weyland-Energy 大脑能量补充剂功能:提神.提高注意力服用方法:建议饭后1颗,一天1次或者2次,间隔4-6小时,一天不要超过4片. 成分:每2颗含 ...
- Python3.x--33个保留字
查询方法也在下图:
- 【转载】华为荣耀V9的手机录屏功能如何开启
手机录屏有时候对我们的帮助很大,例如可以录制相应的APP使用教程.微信小程序使用流量讲解视频等,针对于软件开发人员等来说,手机录屏功能针对功能演示视频非常的有帮助.在华为荣耀V9手机中,进行手机录屏有 ...
- Django:RestFramework之-------权限
4.restframework-权限 4.1权限: 权限在单个视图应用. class MyPermission(object): """认证类""&q ...
- JCEF-tab形式展示浏览器
当我们点击target值为_blank的链接时,JCEF默认以弹出窗口的形式打开新页面,要实现tab栏形式,可参考以下步骤 1.创建一个实现CefLifeSpanHandlerAdapter的类,重写 ...
- 解决kettle在两个mysql之间迁移数据时乱码的问题 和 相关报错 及参数调整, 速度优化
1. 乱码问题 编辑目标数据库的链接: 配置编码参数即可. 2. 报错 No operations allowed after statement closed. 需要调整wait_timeout: ...
- python笔记--------二
tolist()方法: 列表可通过array()转换为数组或mat()转为矩阵 而tolist()可把数组对象或矩阵对象转为列表 数组对象: array([[1, 2, 3], [1, 2, 3]]) ...