gethostbyname和struct hostent详解

不用写触发器!帆软填报报表自动记录创建/修改时间的终极方案 本文详细介绍了帆软填报报表中无需编写数据库触发器,即可自动记录数据创建时间和修改时间的终极方案。该方案利用帆软内置函数和单元格条件属性,在应用层实现日期自动生成,有效规避了触发器带来的权限、维护和部署难题,为数据填报提供了更轻量、灵活且易于维护的解决方案。 阅读详情

struct hostent *gethostbyname(const char *name);

gethostbyname函数根据域名解析出服务器的ip地址,它返回一个结构体struct 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 */


除了服务器的ip地址外,这个结构体还包含了更多服务器的信息,有:


char *h_name

This is the “official” name of the host. 


char **h_aliases

These are alternative names for the host, represented as a null-terminated vector of strings. 

主机的可选名字,以NULL做为结束标记


int h_addrtype

This is the host address type; in practice, its value is always either AF_INET or AF_INET6, with the latter being used for IPv6 hosts. In principle other kinds of addresses could be represented in the database as well as Internet addresses; if this were done, you might find a value in this field other than AF_INET or AF_INET6. See Socket Addresses. 


int h_length

This is the length, in bytes, of each address. 

ip地址的长度,ipv4对应4个字节


char **h_addr_list

This is the vector of addresses for the host. (Recall that the host might be connected to multiple networks and have different addresses on each one.) The vector is terminated by a null pointer. 

一般主机可以有多个ip地址,比如www.163.com就有121.14.228.43和121.11.151.72两个ip,h_addr_list就用来

保存多个ip地址


char *h_addr

This is a synonym for h_addr_list[0]; in other words, it is the first host address.

即为h_addr_list[0],表示第一个地址,这个符号其实是兼容老系统而存在的



我们写一个程序来获取主机www.163.com的详细信息:


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define SERVPORT 80

int main(int argc, char **argv)
{
    int i, sockfd;
    struct hostent *host;
    struct sockaddr_in serv_addr;

    if ((host = gethostbyname(argv[1])) == NULL) {
        printf("gethostbyname error\n");
        exit(0);
    }

    printf("official name: %s\n\n", host->h_name);
    printf("address length: %d bytes\n\n", host->h_length);

    printf("host name alias: \n");
    for (i = 0; host->h_aliases[i]; i++) {
        printf("%s\n", host->h_aliases[i]);
    }
    printf("\naddress list: \n");

    for (i = 0; host->h_addr_list[i]; i++) {
        if ((sockfd = socket(AF_INET, SOCK_STREAM,0)) == -1) {
            printf("socket error\n");
            exit(0);
        }
        // 先清零,然后用struct sockaddr_in来填值
        bzero(&serv_addr, sizeof(serv_addr));
        serv_addr.sin_family = AF_INET;
        serv_addr.sin_port = htons(SERVPORT);
        /* h_addr_list[i]指向in_addr类型 */
        serv_addr.sin_addr = *((struct in_addr *)host->h_addr_list[i]);
        const char *ip = inet_ntoa(serv_addr.sin_addr);
        printf("connect to %s  ", ip);

        // 系统调用的时候,把sockaddr_in转换成sockaddr
        if (connect(sockfd, (struct sockaddr *)&serv_addr, \
                    sizeof(struct sockaddr)) == -1) {
            printf("error\n");
            exit(0);
        }
        printf("success\n");
    }

    return 0;
}


运行结果如下:


这个程序首先调用gethostbyname得到服务器的各种信息,其中就包含它拥有的ip地址,保存在h_addr_list中,然后

对于h_addr_list中的每个ip地址,都调用connect连接其80端口。h_addr_list保存的ip地址类型是char *,

struct sockaddr_in中sin_addr的类型是struct in_addr,而程序中却直接把h_addr_list[i]强制转换成struct in_addr *

serv_addr.sin_addr = *((struct in_addr *)host->h_addr_list[i]);

这是没有问题的,因为h_addr_list保存的并不是真正的字符串,而是指向struct in_addr类型的指针。



另外,struct in_addr用来表示ip地址,本质上是一个long类型,刚好4个字节。然后我们调用inet_ntoa把它转换

成可读性更强的dots-and-number字符串。关于ip地址和dots-and-number字符串之间的转换有4个函数:

 

#include <arpa/inet.h>
/* network to ascii */
char *inet_ntoa(struct in_addr in);     						
/* ascii to network */
int inet_aton(const char *cp, struct in_addr *inp);

const char *inet_ntop(int af, const void *src, 
								char *dst, socklen_t size);
int inet_pton(int af, const char *src, void *dst);  /* presentation format to network */
 

 

inet_ntoa和inet_aton不支持ipv6, 据说迟早要废除,不过目前来说,很多系统都可以看见这两个函数

R语言中的混淆矩阵(Confusion Matrix)是一种常用的评估多分类模型性能的工具 除了准确率,混淆矩阵还提供了其他有用的指标,如灵敏度(Sensitivity)、特异度(Specificity)、精确度(Precision)和召回率(Recall)。混淆矩阵通过比较模型预测结果与实际标签的一致性,帮助我们了解模型的分类准确性和错误类型。此外,混淆矩阵还提供了各种错误类型的统计信息,如假阳性(False Positive)和假阴性(False Negative)等。通过混淆矩阵,我们可以了解模型的整体性能和错误类型,从而对模型进行评估和改进。最后,为了更好地理解混淆矩阵的结果,可以使用。 阅读详情

相关推荐

局部路径规划算法 - B样条曲线(B-spline Curves)

本文详解了B样条以及代码实现

BigDavid123的博客 6506

域名解析——gethostbyname()函数及socket客户端域名解析

###gethostbyname()函数说明 gethostbyname()——用域名或主机名获取IP地址 头文件: #include <netdb.h> #include <sys/socket.h> 函数原型: struct hostent *gethostbyname(const char *name); 这个函数的传入值是域名或者主机名。返回值是一个hostent的结构体。如果函数调用失败,返回NULL。结构如下: struct hostent { cha

ZHENYU的博客 5165

在linux上本地大模型部署与推理

您的Python脚本(客户端)可能在您的个人电脑上,而模型服务(服务器)在远程Linux服务器上。如果您的服务器有强大的NVIDIA GPU,并且您对性能有更高的要求(例如需要高吞吐量),vLLM是更好的选择。这种方式无需向公网暴露服务器端口,而是通过加密的SSH通道将服务器的端口“映射”到您的本地电脑上。我们将启动一个API服务器,它会加载您指定的模型,并等待您的代码前来调用。如果您直接在SSH窗口运行上面的命令,一旦您关闭窗口,服务就会停止。这是根据您的原始代码修改的版本,适配本地vLLM服务。

frostmelody 全网同名,大家多多关注呀~ 持续分享优质内容! 2053

gethostbyname()函数详解

基本概念: gethostname()函数主要作用:用域名或者主机名获取地址,操作系统提供的库函数 函数原型: GETHOSTBYNAME(3) Linux Programmer's Manual GETHOSTBYNAME(3) NAME gethostbyname, gethostbyaddr, sethostent,

daiyudong2020的博客 6万+

Java实现双色球&大乐透随机选号算法——原理详解与代码实战

掌握核心语法:集合操作、随机数生成、排序。贴近实际场景:将编程知识应用于生活问题的解决。

wangchl0932的博客 4974

WRF后处理:python cartopy绘制土地利用/土地分类图//python绘制WRF下垫面类型(以北极为例)

下垫面类型对于WRF的地表过程十分重要,而在我们研究WRF的地表过程之前,需要对输入的土地利用类型进行一些绘制,以便后续的修改。LU_MODIS21函数定义了绘制的土地类型、标签与对应色标,我们使用时,直接引用LU_MODIS21()即可返回。其实很简单,只要将你拥有的土地类型数据提取出来,将原本函数中的labels和C切片,重新定义色标再绘制即可。在这里,我将以北极地区为例,绘制北极地区的WRF下垫面数据,我使用的MODIS21这类。

weixin_43750300的博客 3857

【Linux C | 网络编程】gethostbyname 函数详解及C语言例子

👉本文主要介绍将域名转换为IP地址的函数gethostbyname,以及提供使用例子。

wkd_007的博客 7565

ISP图像处理Verilog仿真框架搭建(附代码)

基于Verilog的图像处理仿真框架搭建

路漫漫其修远兮,吾将上下而求索 1896

gethostbyname的用法以及阻塞问题

gethostbyname函数通常用于根据域名获取ip地址,函数原型如下所示 #include <netdb.h> struct hostent *gethostbyname(const char *name); 函数返回hostent结构指针,如果失败则返回NULL指针。 hostent结构定义如下所示 struct hostent { char *h_name; // 主机规范名 char **h_aliases; // 主机别名,可能有多个别名,以空指针结束

togolife的博客 4972

价值投资/指标选股(akshare)

利用akshare的数据源,可以获取所有的股票数据以及公开的财务数据,可以进行条件筛选,获取满足条件的股票。 这套模板可以用于价值投资,指标选股。选股周期为日线级别。然后结果可以邮箱发送。 import time import akshare as ak ## A 股上市公司的实时行情数据 stock_zh_a_spot_df = ak.stock_zh_a_spot() #print(stock_zh_a_spot_df) ##取前300测试 ##取前300测试 df_stock =...

qq_26742269的博客 1万+

面向企业架构师的 SAP BTP 全景实践:多云、账户、运行时与端到端开发路径

摘要:SAP BTP为企业提供多云、多运行时(Cloud Foundry/Kyma/ABAP Cloud)的数字化转型平台,支持快速构建扩展应用。关键选择包括:1)根据合规与性能选择区域;2)区分Trial(90天限制)与Free Tier(无期限)方案;3)按场景选择运行时(CF适合微服务/Kyma适合云原生/ABAP Cloud适合S/4HANA扩展)。建议优先使用Free Tier进行POC,并通过BTP Cockpit统一管理,实现从验证到生产的平滑过渡。(150字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 253

linux / gethostbyname() 函数详解

1、作用用域名或者主机名获取地址,操作系统提供的库函数。域名系统(Domain Name System,DNS)主要用于主机名字与 IP 地址之间的映射。每个组织机构往往运行一个或多个名字服务器(name server),我们编写的客户端和服务器等应用程序通过调用解析器(resolver)的函数库中的函数接触 DNS 服务器。常见的解析器函数是 gethostbyname 和 gethostbyaddr,下图展示了应用进程、解析器和名字服务器之间的一个典型关系。 二、返回值 失败返回 NULL 指针,

布袋和尚 3044

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

struct-hostent *gethostbyname(const char *name)详解

struct hostent *gethostbyname(const char *name); gethostbyname函数根据域名解析出服务器的ip地址,它返回一个结构体struct hostent: #include struct hostent { char *h_name; /* official name of host */ ch

caoyaobin的专栏 850

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

别再只会ping了!用C语言手写一个自己的域名解析工具(基于gethostbyname)

本文详细介绍了如何使用C语言和gethostbyname函数从零构建一个自定义域名解析工具。通过解析hostent结构体,开发者可以深入理解DNS协议栈,并实现定制化的域名查询功能,适用于嵌入式系统等特定场景。文章包含完整代码示例、错误处理技巧及性能优化建议。

weixin_30482181的博客 420

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

struct hostent 结构体与gethostbyname(),gethostbyaddr

1、hostent 数据结构是这样的: struct hostent { char *h_name; char **h_aliases; int h_addrtype; int h_length; char **h_addr_list; }; #define h_addr h_addr_list[0] 这里是这个数据结构的详细资料: struct hostent: h_name – 地址的正式名称。 h_aliases – 空字节-地址的预备名称的指针,也可以这样说 一个以空指针结尾的可选主机名队列。 h_

bjzxlyh的博客 440

struct hostent结构体

struct hostent结构体 这个数据结构是这样的:  struct    hostent {     const char    *h_name;    // official name of host     char    **h_aliases;    // alias list     short    h_addrtype;    // host addre

woke666的专栏 884

gethostbyname && struct hostent 示例

struct hostent *gethostbyname(const char *name); gethostbyname函数根据域名解析出服务器的ip地址,它返回一个结构体struct hostent: #include struct hostent { char *h_name; /* official name of host */

joker0910的专栏 2601

struct hostent结构体使用

结构体定义: struct hostent { char *h_name; //正式主机名 char **h_aliases; //主机别名 int h_addrtype; //主机IP地址类型:IPV4-AF_INET int h_length; //主机IP地址字节长度,对于IPv4是四字节,即32位 char **h_add

wynter_的博客 2万+

gethostbyname的返回值类型struct hostent

 这个数据结构是这样的:    struct hostent {    char *h_name;    char **h_aliases;    int h_addrtype;    int h_length;    char **h_addr_list;    };    #define h_addr h_addr_list[0]  这里是这个数据结构的详细资料:  struct hosten

ljx0305的专栏 4559

UNP编程:30---名字与地址转换之(地址解析函数:gethostbyname()、gethostbyaddr()、hstrerror()、struct hostent)

一、引入 认知计算机主机通常采用直观可读的名字。本书到目前为止的所有例子都有意使用IP地址而不是名字,这样我们能够确切地知道:对于诸如connect和sendto这样的函数,进入套接字地址结构的是什么内容;对于诸如accept和recvfrom这样的函数,返回的是什么内容。然而大多数应用程序应该处理名字而不是地址。当我们往IPv6转移时,这一点变得尤为正确,因为IPv6 地址(十六进制数串)比I...

董哥的黑板报 1090
上一篇: 添加默认路由的一个小例子以及原理
下一篇: 子网掩码详解
小Mac
博客等级 码龄15年 6粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值