当前位置:网站首页>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]所创,转载请带上原文链接,感谢
边栏推荐
- Handwriting Koa.js Source code
- 向北京集结!OpenI/O 2020启智开发者大会进入倒计时
- Front end code style practice prettier + eslint + git hook + lint staged
- From the practice, this paper discusses the problems caused by the inconsistent design of ruby syntax.
- Wechat circle
- Mac terminal oh my Zsh + solarized configuration
- Android check box and echo
- 安全(杂记)
- Open source projects for beginners on GitHub (Python)
- jsliang 求职系列 - 08 - 手写 Promise
猜你喜欢
ThinkPHP门面源码解析
程序人生|从网瘾少年到微软、BAT、字节offer收割机逆袭之路
Shoes? Forecasting stock market trends? Taobao second kill? Python means what you want
Handwriting Koa.js Source code
After SQL group query, get the first n records of each group
商品管理系统——商品新增本地保存实现部分
EFF 认为 RIAA 正在“滥用 DMCA”来关闭 YouTube-DL
AI fresh student's annual salary has increased to 400000, you can still make a career change now!
Rainbow sorting | Dutch flag problem
使用rem,做到屏幕缩放时,字体大小随之改变
随机推荐
Ten year itch of programmer
Android 复选框 以及回显
日志分析工具 - GoAccess
A simple ability determines whether you will learn!
解决IDEA快捷键 Alt+Insert 失效的问题
手写Koa.js源码
Understanding task and async await
上周热点回顾(11.2-11.8)
for与for...in、for Each和map和for of
[design pattern] Chapter 4: Builder mode is not so difficult
Understanding runloop in OC
微信视频号播主排行榜2020年10月
Interview summary on November 7, 2020 (interview 12K)
Composition - API
Reading design patterns adapter patterns
When Python calls ffmpeg, 'ffmpeg' is not an internal or external command, nor a runnable program
Aren't you curious about how the CPU performs tasks?
Implement crud operation
Dynamo: a typical distributed system analysis
Rainbow sorting | Dutch flag problem