当前位置:网站首页>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]所创,转载请带上原文链接,感谢
边栏推荐
猜你喜欢

手写Koa.js源码

《内网安全攻防》配套视频 之 利用PS查询域内信息

Reading design patterns adapter patterns

Log analysis tool - goaccess

Visual Studio (MAC) installation process notes

Handwriting Koa.js Source code

VisualStudio(Mac)安装过程笔记

After SQL group query, get the first n records of each group

Configure switch trunk interface traffic local priority forwarding (cluster / stack)

Open source projects for beginners on GitHub (Python)
随机推荐
使用流读文件写文件处理大文件
基于synchronized锁的深度解析
彩虹排序 | 荷兰旗问题
SQL第二章第三章
1486. Array XOR operation
大型项目Objective-C - NSURLSession接入短信验证码应用实例分享
抢球鞋?预测股市走势?淘宝秒杀?Python表示要啥有啥
A simple ability determines whether you will learn!
inet_pton()和inet_ntop()函数详解
做用户,绕不开画像!
从实践谈 Ruby 语法上的几个设计不一致带来的问题。
手写Koa.js源码
Understanding task and async await
for与for...in、for Each和map和for of
SHOW PROFILE分析SQL语句性能开销
程序人生|从网瘾少年到微软、BAT、字节offer收割机逆袭之路
Understanding runloop in OC
微信视频号播主排行榜2020年10月
你不好奇 CPU 是如何执行任务的吗?
AI应届生年薪涨到40万了,你现在转行还来得及!