C - inet ntoa aton (網路轉換相關)




宣告及定義


#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int inet_aton(const char *cp, struct in_addr *inp); // 網路字串(char *cp)轉網路數值. 成功回傳1, 失敗回傳0
in_addr_t inet_addr(const char *cp); // 功能與 inet_aton 相同,但是失敗回傳的-1255.255.255.255衝突。所以改用 inet_aton
in_addr_t inet_network(const char *cp); // 功能與 inet_addr 相同,測試起來會數值會反轉

char *inet_ntoa(struct in_addr in); // 網路數值轉網路字串
struct in_addr inet_makeaddr(in_addr_t net, in_addr_t host); // net host 合併
in_addr_t inet_lnaof(struct in_addr in); // 回傳網路數值的低位元部份 (依網路位元組序)
in_addr_t inet_netof(struct in_addr in); // 回傳網路數值的高位元部份 (依網路位元組序)

// 數值定義
typedef uint32_t in_addr_t;
// 結構定義
struct in_addr {
in_addr_t s_addr;
};



範例


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

int main(int argc, char **argv) {
struct in_addr inp;
int ret;
ret = inet_aton("192.168.111.222", & inp);
printf("inet_aton => %x, %d\n", inp.s_addr, ret);
printf("inet_addr => %x\n", inet_addr("192.168.111.222"));
printf("inet_network => %x\n", inet_network("192.168.111.222"));
printf("\n");
printf("inet_ntoa => %s\n", inet_ntoa(inp));
printf("inet_lnaof => %x\n", inet_lnaof(inp));
printf("inet_netof => %x\n", inet_netof(inp));
printf("\n");
ret = inet_aton("172.16.111.222", & inp);
printf("inet_aton => %x, %d\n", inp.s_addr, ret);
printf("inet_lnaof => %x\n", inet_lnaof(inp));
printf("inet_netof => %x\n", inet_netof(inp));
printf("inet_makeaddr => %x\n", inet_makeaddr(0x1122, 0x3344).s_addr);
return 0;
}

===== 執行結果 ======================
inet_aton => de6fa8c0, 1
inet_addr => de6fa8c0
inet_network => c0a86fde

inet_ntoa => 192.168.111.222
inet_lnaof => de
inet_netof => c0a86f

inet_aton => de6f10ac, 1
inet_lnaof => 6fde
inet_netof => ac10
inet_makeaddr => 44332211



其他常用


#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong); // 用於本機序轉換到網路序
uint16_t htons(uint16_t hostshort); // 用於本機序轉換到網路序
uint32_t ntohl(uint32_t netlong); // 用於網路序轉換到本機序
uint16_t ntohs(uint16_t netshort); // 用於網路序轉換到本機序

在x86用起來就是反轉順序,如:htonl(0xaa11bb22) 執行結果為 0x22bb11aa

註:在 little-endian 上呼叫,結果會跟輸入值相同


其他範例


char *my_ipv4_broadcast(char *ip, char *netmask)
{
static char buffer[32];
in_addr_t _ip = inet_addr(ip);
in_addr_t _netmask = inet_addr(netmask);
struct in_addr _broadcast;

_broadcast.s_addr = _ip | ~_netmask;
sprintf(buffer, "%s", inet_ntoa(_broadcast));

return buffer;
}
char *my_ipv4_netid(char *ip, char *netmask)
{
static char buffer[32];
in_addr_t _ip = inet_addr(ip);
in_addr_t _netmask = inet_addr(netmask);
struct in_addr _netid;

_netid.s_addr = _ip & _netmask;
sprintf(buffer, "%s", inet_ntoa(_netid));

return buffer;
}




沒有留言:

張貼留言