当前位置:网站首页>inet_ Pton () and INET_ Detailed explanation of ntop() function
inet_ Pton () and INET_ Detailed explanation of ntop() function
2020-11-09 11:32:00 【Pile】
1. hold ip The address is converted into a binary value for network transmission
int inet_aton(const char *cp, struct in_addr *inp);
inet_aton() transformation Network host address ip( Such as 192.168.1.10) by Binary values , And stored in struct in_addr In structure , That's the second parameter *inp, Function returns non 0 Express cp The host is efficient , return 0 Indicates that the host address is invalid .( This conversion cannot be used for network transmission , You also need to call htons or htonl Function to convert host byte order to network byte order )
in_addr_t inet_addr(const char *cp);
inet_addr Function conversion Network host address ( Such as 192.168.1.10) by Network byte order binary value , If parameters char *cp Invalid , The function returns -1(INADDR_NONE), This function is dealing with address 255.255.255.255 When you go back to -1,255.255.255.255 Is a valid address , however inet_addr Unable to deal with ;
2. Convert the binary value of network transmission into dot decimal ip Address
char *inet_ntoa(struct in_addr in);
inet_ntoa function Translate network byte sort address by The standard ASCII Addresses separated by dots , This function returns the address of the string pointing to the point separated ( Such as 192.168.1.10) The pointer to , Space allocated for the static string , This means that when the function is called the second time , The last call will be overridden ( Covering ), So if you need to save the string, you can copy it and manage it yourself !
How do we output a dot decimal IP Well ? Let's take a look at the following program :
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
int main()
{
struct in_addr addr1,addr2;
ulong l1,l2;
l1= inet_addr("192.168.0.74");
l2 = inet_addr("211.100.21.179");
memcpy(&addr1, &l1, 4);
memcpy(&addr2, &l2, 4);
printf("%s : %s\n", inet_ntoa(addr1), inet_ntoa(addr2)); // Pay attention to the result of this sentence
printf("%s\n", inet_ntoa(addr1));
printf("%s\n", inet_ntoa(addr2));
return 0;
}
The actual operation results are as follows :
192.168.0.74 : 192.168.0.74 // You can see it here ,printf Inside inet_ntoa Only run once .
192.168.0.74
211.100.21.179
inet_ntoa Return to one char *, And this char * The space is in inet_ntoa It's statically allocated , therefore inet_ntoa Subsequent calls will override the previous call . The first sentence printf The result can only show that in printf Variable parameters in it It's evaluated from right to left Of , That's it .
3. New network address translation function inet_pton and inet_ntop
These two functions follow IPv6 Functions that appear , about IPv4 Address and IPv6 All addresses apply , Function p and n Each represents the expression (presentation) And numbers (numeric). Address is usually expressed in the form of ASCII character string , The numeric format is a binary value stored in the socket address structure .
#include <arpa/inet.h>
int inet_pton(int family, const char *strptr, void *addrptr); // Will be dotted decimal ip The address is converted into a numeric format for network transmission
Return value : If successful 1, If the input is not a valid expression 0, In case of error -1
const char * inet_ntop(int family, const void *addrptr, char *strptr, size_t len); // Convert numerical format to dot decimal ip Address format
Return value : If successful, a pointer to the structure , In case of error NULL
(1) Of these two functions family The parameter can be either AF_INET(ipv4) It can also be AF_INET6(ipv6). If , Take an unsupported address family as family Parameters , Both functions return an error , And will errno Set as EAFNOSUPPORT.
(2) The first function attempts to convert from strptr The string that the pointer points to , And pass addrptr The pointer holds the binary result , If successful, the return value is 1, Otherwise, if specified family The input string is not a valid expression format , So the return value is zero 0.
(3)inet_ntop Do the opposite conversion , From the numerical format (addrptr) Convert to expression (strptr).inet_ntop Functional strptr Parameter cannot be a null pointer . The caller must allocate memory for the target storage unit and specify its size , When the call succeeds , This pointer is the return value of the function .len Parameter is the size of the target storage unit , To prevent the function from overflowing its caller's buffer . If len Too small , Not enough to hold expression results , Then return a null pointer , Juxtaposition as errno by ENOSPC.
4. Example
inet_pton(AF_INET, ip, &foo.sin_addr); // Instead of foo.sin_addr.addr=inet_addr(ip);
char str[INET_ADDRSTRLEN];
char *ptr = inet_ntop(AF_INET,&foo.sin_addr, str, sizeof(str)); // Instead of ptr = inet_ntoa(foo.sin_addr)
版权声明
本文为[Pile]所创,转载请带上原文链接,感谢
边栏推荐
猜你喜欢
零基础IM开发入门(四):什么是IM系统的消息时序一致性?
Open source projects for beginners on GitHub (Python)
Python zero basics tutorial (01)
Kubernetes业务日志收集与监控
外贸自建网站域名的选择— Namesilo 域名购买
ThinkPHP框架执行流程源码解析
Source code analysis of ThinkPHP framework execution process
Mac 终端(terminal) oh-my-zsh+solarized配置
从编码、网络传输、架构设计揭秘腾讯云高质量、高可用实时音视频技术实践...
The choice of domain name of foreign trade self built website
随机推荐
Glsb involves load balancing algorithm
“微服务”技术另一个可能更合适的名字
用一种简单的方式实现终端文字粘贴板
El table dynamic header
Configure switch trunk interface traffic local priority forwarding (cluster / stack)
使用流读文件写文件处理大文件
大型项目Objective-C - NSURLSession接入短信验证码应用实例分享
Ten year itch of programmer
050_ object-oriented
Kubernetes业务日志收集与监控
开源ERP招聘了
你不好奇 CPU 是如何执行任务的吗?
从实践谈 Ruby 语法上的几个设计不一致带来的问题。
Analysis of the source code of ThinkPHP facade
Adobe Experience Design /Xd 2020软件安装包(附安装教程)
1450. 在既定时间做作业的学生人数
十五年后,重构一个“在线的腾讯”
《内网安全攻防》配套视频 之 利用PS查询域内信息
iPhone“连到系统上的设备没有发挥作用”原因分析及解决方法 20200105
for与for...in、for Each和map和for of