inet_aton是将IPv4地址(点分法)转换成对应的十进制整数;而inet_ntoa是将十进制整数转换成对应的IPv4地址(点分法)。 ", __inet_aton( IP_ADRESS ), __inet_ntoa(__inet_aton( IP_ADRESS )) ); return 0; } 3 编译执行 使用《Linux Manual INET(3) NAME inet_aton, inet_addr, inet_network, inet_ntoa 关于inet_aton的man说明: [vfhky@typecodes ~]$ man inet_ntoa INET(3) Linux Programmer's Manual INET(3) NAME inet_aton, inet_addr, inet_network, inet_ntoa
inet_network(const char *cp); int inet_pton(int af, const char *src, void *dst); const char *inet_ntop /inet_addr inet_addr ip: 1241557184 inet_network ip: -1062731702 inet_network ip ------------ IP字符串 《——》 网络字节流 inet_addr、inet_aton、inet_ntoa 程序代码: #include <stdio.h> #include <sys/socket.h ("inet_pton ip: 0x%x/n", addr.s_addr); } const char *pstr = inet_ntop(AF_INET, (void *)&addr /inet_ptoa inet_pton ip: 1241557184 inet_pton ip: 0x4a00a8c0 inet_ntop ip: 192.168.0.74
inet_pton Linux下这2个IP地址转换函数,可以在将IP地址在“点分十进制”和“整数”之间转换 而且,inet_pton和inet_ntop这2个函数能够处理ipv4和ipv6。 /inet.h> int inet_pton(int af, const char *src, void *dst); 这个函数转换字符串到网络地址,第一个参数af是地址族,转换后存在dst中 inet_pton 是inet_addr的扩展,支持的多地址族有下列: af = AF_INET src为指向字符型的地址,即ASCII的地址的首地址(ddd.ddd.ddd.ddd格式的) (AF_INET, IPdotdec, (void *)&s); printf("inet_pton: 0x%x\n", s.s_addr); // 注意得到的字节序 // 反转换 inet_ntop (AF_INET, (void *)&s, IPdotdec, 16); printf("inet_ntop: %s\n", IPdotdec); }
在Socket编程中,inet_ntop、inet_pton 以及字节序转换函数(如 htons(), htonl(), ntohs(), ntohl())是非常重要的工具,用于处理IP地址和端口号的表示与转换 先放总结 IP地址转换:二进制网络地址和点分十进制文本之间的转换; 字节序转换:大端字节序(网络) 和 小端字节序(可能是主机) 之间的转换; inet_ntop 和 inet_pton inet_ntop 函数原型: const char *inet_ntop(int af, const void *src, char *dst, socklen_t size); 其中 af 是地址族(如 AF_INET 或 AF_INET6),src 是指向网络地址结构的指针,dst 是目标字符串的缓冲区,size 是目标缓冲区的大小。 inet_pton: 这个函数与 inet_ntop 相反,它用于将可读的字符串格式的IP地址转换为网络地址结构。
在学习c++ MFC SOCKET开发中遇到了如下的报错: error C4996: 'inet_ntoa': Use inet_ntop() or InetNtop() instead or Step 1:在头部添加头文件 #include<WS2tcpip.h> Step 2:将inet_ntoa(clientAddr.sin_addr);替换为 char sendBuf[20] = { '\0' }; inet_ntop(AF_INET, (void*)&clientAddr.sin_addr, sendBuf, 16); Step 3:将addr.sin_addr.S_un.S_addr =inet_addr("127.0.0.1");替换为 inet_pton(AF_INET, "127.0.0.1", (void*)&addr.sin_addr.S_un.S_addr); 最后问题完美解决
这是一个来自TF的inet-vpn,由SDN GW导入到VRF中。SDN网关和计算节点之间的数据平面是MPLSoUDP。 这是因为我们有inet-vpn、静态、PE-CE路由,而SDN GW必须通告inet路由,并重新通告inet-vpn路由(从TF到RR)。 都有哪些策略?分别控制什么路由? 然而,该策略无法控制已经是inet-vpn路由的路由:这里是指TF路由。 这些路由首先以inet-vpn路由的形式从Tungsten Fabric来,并存储到bgp.l3vpn.0中。 了解VRF策略的范围,以及如何处理属于不同家族的路由(inet或inet-vpn)是至关重要的。 如何控制来自TF的路由? 来自TF的路由是inet-vpn的,所以不能依靠VRF导出/导入策略。我们需要根据应用于会话的导出策略对RR(或远程PE)采取行动。
这几天在做一个功能实现的时候,需要把别人用 Python2.6 写好的脚步转成 Python3.4 实现,大部分地方转化都没啥问题,但是在 socket.inet_aton() 转化的过程中出了点问题 需求目的:把一个 ip 地址使用 socket.inet_aton() 转化后和一个字符串组合,然后算出 MD5。 下面是 Python2.6 的实现代码: #! (ip) + base_str).digest().encode('hex') TypeError: can't concat bytes to str 提示说的是,socket.inet_aton(ip 也就是说 Python2.6 和 python3.4 中对于 socket.inet_aton(ip) 的实现是有差异的,查官方文档吧。 python2.6文档说明: socket.inet_aton(ip_string) Convert an IPv4 address from dotted-quad string format (for
,INET_ATON(?) 可以看出在5.6上不管用于select,insert inet_aton函数,当参数为空字符串时,都能返回null,并正确处理。 而在5.7版本上,当在执行select时inet_aton能返回null,但是在insert语句中报了错,和我程序报的错一样。 至此可以看出程序中报的错就是因为MySQL5.6、5.7对inet_aton函数行为差异导致的。也就是5.7对inet_aton函数的参数有了更强的校验。 其实select中也报了同样的异常,只是把异常当作warning了,当执行完select inet_aton('');后可以看到下面有1 warning的字样。
inet->inet_rcv_saddr = inet->inet_saddr = addr->sin_addr.s_addr; ... if ((snum || ! inet->inet_sport = htons(inet->inet_num); inet->inet_daddr = 0; inet->inet_dport = 0; ... return err; } EXPORT_SYMBOL(inet_bind); 该方法设置struct inet_sock中的字段如下 inet->inet_saddr = addr->sin_addr.s_addr ; inet->inet_sport = htons(inet->inet_num); inet->inet_daddr = 0; inet->inet_dport = 0; 可见,目标地址和端口都设置为 inet->inet_num的值赋值给inet->inet_sport,所以,inet->inet_sport的最终值就是用户传入的端口。
*inet = inet_sk(sk); ... //bind时 将 inet_rcv_saddr 和 inet_saddr 都设置为地址 inet->inet_rcv_saddr = inet->inet_saddr = addr->sin_addr.s_addr ; //bind 时设置要使用的端口 inet->inet_sport = htons(inet->inet_num); ... } 这个函数有两个重点参数,分别是 sock 和 uaddr。 inet->inet_sport 成员上。 *inet = inet_sk(sk); //只有网络命名空间和端口等都匹配才真正计算匹配分 if (net_eq(sock_net(sk), net) && inet->inet_num ==
inet_connection_sock *icsk = inet_csk(sk); struct inet_sock *inet = inet_sk(sk); ... sk->sk_prot->get_port(sk, inet->inet_num)) { inet->inet_sport = htons(inet->inet_num); ... 调用sk->sk_prot->get_port(sk, inet->inet_num)方法做 listening transition 验证。 该方法的逻辑在第二篇文章中有讲。 5. err = __inet_hash(sk, NULL); ... } return err; } EXPORT_SYMBOL_GPL(inet_hash); 该方法又调用了__inet_hash ,继续看下 // net/ipv4/inet_hashtables.c int __inet_hash(struct sock *sk, struct sock *osk) { struct inet_hashinfo
*inet = inet_sk(sk); if (inet->num == hnum && ! if (sk->sk_prot->get_port(sk, snum)) { inet->inet_saddr = inet->inet_rcv_saddr = 0; err = -EADDRINUSE inet_csk(sk)->icsk_bind_hash) inet_bind_hash(sk, tb, port); 会调用inet_bind_hash void inet_bind_hash sk->sk_prot->get_port(sk, inet->inet_num)) { inet->inet_sport = htons(inet->inet_num); 我们先看inet_lookup_skb,调用链很长(inet_lookup_skb->inet_lookup->inet_lookup_listener->inet_lhash2_lookup),我们只看关键代码
前言 linux的shell中如何获取服务器的IP地址 内容 ip a | grep inet | grep -v inet6 | grep -v 127.0.0.1 | awk '{print $2} inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host inet 192.168.1.86/24 brd 192.168.1.255 通过grep去除无用的信息 [root@tb_scrm_service_kafka_3 bin]# ip a | grep inet | grep -v inet6 inet 127.0.0.1 grep,再来一次去除一次无用信息 [root@tb_scrm_service_kafka_3 bin]# ip a | grep inet | grep -v inet6 | grep -v '127.0.0.1 地址 [root@tb_scrm_service_kafka_3 bin]# ip a | grep inet | grep -v inet6 | grep -v '127.0.0.1' | awk '
address='74-DF-BF-5E-C3-29', netmask=None, broadcast=None, ptp=None), snic(family=<AddressFamily.AF_INET address='76-DF-BF-5E-C3-29', netmask=None, broadcast=None, ptp=None), snic(family=<AddressFamily.AF_INET address='86-DF-BF-5E-C3-29', netmask=None, broadcast=None, ptp=None), snic(family=<AddressFamily.AF_INET address='54-EE-75-A4-F6-66', netmask=None, broadcast=None, ptp=None), snic(family=<AddressFamily.AF_INET address='00-50-56-C0-00-01', netmask=None, broadcast=None, ptp=None), snic(family=<AddressFamily.AF_INET
); } // inet_hash_connect调用下面函数 int __inet_hash_connect(struct inet_timewait_death_row *death_row, **twp) { struct inet_hashinfo *hinfo = death_row->hashinfo; struct inet_sock *inet = inet_sk( sk); __be32 daddr = inet->inet_rcv_saddr; __be32 saddr = inet->inet_daddr; int dif = sk->sk_bound_dev_if (acookie, saddr, daddr); const __portpair ports = INET_COMBINED_PORTS(inet->inet_dport, lport); unsigned int hash = inet_ehashfn(net, daddr, lport, saddr, inet->inet_dport); struct inet_timewait_sock
; 其次,在该实例的内部,又根据socket类型的不同,划分成四个hashtable: // include/net/inet_hashtables.h struct inet_hashinfo { 来看下代码: // net/ipv4/inet_connection_sock.c int inet_csk_get_port(struct sock *sk, unsigned short snum) inet_csk(sk)->icsk_bind_hash) inet_bind_hash(sk, tb, port); } EXPORT_SYMBOL_GPL(inet_csk_get_port ); 再来看下inet_bind_hash方法: // net/ipv4/inet_hashtables.c void inet_bind_hash(struct sock *sk, struct inet_bind_bucket listen) // __sys_listen // inet_listen // inet_csk_listen_start // inet_hash
//file:net/ipv4/inet_hashtables.c int inet_hash_connect(struct inet_timewait_death_row *death_row, = inet_sk(sk)->inet_num; //获取本地端口配置 inet_get_local_port_range(&low, &high); remaining = (high - (sk)->inet_num,如果我们调用过 bind,那么这个函数会选择好端口并设置在 inet_num 上。 //file: net/ipv4/inet_hashtables.c static int __inet_check_established(struct inet_timewait_death_row , __daddr, __ports, __dif) \ ((inet_sk(__sk)->inet_portpair == (__ports)) && \ (inet_sk(__sk)->inet_daddr
inet 得到如下信息: inet 127.0.0.1 netmask 0xff000000 inet6 ::1 prefixlen 128 inet6 fe80::1%lo0 inet 192.168.12.139 netmask 0xffffff00 broadcast 192.168.12.255 inet6 fd86:415c:c5f9::c72:1c02:f044 inet6 fe80::9446:a1ff:fe5e:9b8f%awdl0 prefixlen 64 scopeid 0x9 inet6 fe80::9d71:6fa:3da5:9cb6%utun0 我们再排除掉 inet6 和 127 的信息,就可以得到我们的本地IP了 ifconfig | grep inet | grep -v inet6 | grep -v 127 得到 inet 192.168.12.139 所以我们把上面的命令修改一下,改成 ip a | grep inet | grep -v inet6 | grep -v 127 | sed 's/^[ \t]*//g' | cut -d ' ' -f2
Public StateStyle As Integer Private Sub cmdDIR_Click() StateStyle = 0 Inet1.AccessType = icUseDefault '设置与Internet连接的类型,默认值 Inet1.Protocol = icFTP Inet1.RemotePort = 21 bln = False Inet1.Execute , , "系统提示" StateStyle = 0 Inet1.AccessType = icUseDefault '设置与Internet连接的类型,默认值 Inet1.Protocol = icFTP Inet1.RemotePort = 21 bln = False Inet1.Execute txtURL.Text, "DIR " '检索目录 End Sub Private vtData = Inet1.ResponseCode & ":" & _ Inet1.ResponseInfo Case icResponseCompleted
bridge ebtables inet 同时适用于 IPv4 和 IPv6 的数据包,即统一了 ip 和 ip6 簇,可以更容易地定义规则,下文的示例都将采用 inet 簇。 先创建一个新的表: $ nft add table inet my_table 列出所有的规则: $ nft list ruleset table inet my_table { } 现在表中还没有任何规则 $ nft add set inet my_table my_concat_set { type ipv4_addr . inet_proto . inet_service \; } $ nft list ipv4_addr . inet_proto . inet_service } } 向集合中添加元素: $ nft add element inet my_table my_concat_set 例如: $ nft add table inet table_one $ nft add chain inet table_one my_chain $ nft add table inet table_two