in_addr 转换为 string(char*)

本文介绍了一个将IP地址从网络字节顺序转换为点分十进制字符串的C语言函数实现。该函数首先将输入的IP地址转换为整数形式,然后逐位提取并格式化输出。文章还提供了完整的源代码及版权声明。

char* hexToCharIP(struct in_addr addrIP) { char* ip; unsigned int intIP; memcpy(&intIP, &addrIP,sizeof(unsigned int)); int a = (intIP >> 24) & 0xFF; int b = (intIP >> 16) & 0xFF; int c = (intIP >> 8) & 0xFF; int d = intIP & 0xFF; if((ip = (char*)malloc(16*sizeof(char))) == NULL) { return NULL; } sprintf(ip, "%d.%d.%d.%d", d,c,b,a); return ip; }

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/wangicter/archive/2011/04/09/4767480.html

请你学习一下json_api.h的函数,再改一下我的代码,请不要到处乱创造函数。 extern JSON_OBJPTR jso_new_obj(); extern void jso_free_obj(JSON_OBJPTR obj); extern JSON_OBJPTR jso_new_string(char *str); extern JSON_OBJPTR jso_obj_get(JSON_OBJPTR obj, const char *key); extern void jso_obj_add(JSON_OBJPTR obj, const char *key, JSON_OBJPTR val); extern void jso_obj_del(JSON_OBJPTR obj, const char *key); extern JSON_OBJPTR jso_from_string(const char *json_string); extern int jso_to_string(JSON_OBJPTR obj, char *str_buf, int len); extern JSON_OBJPTR *jso_next_sub_obj(JSON_OBJPTR obj, JSON_OBJPTR *cur, char **key); extern int jso_add_string(JSON_OBJPTR obj, const char *key, const char *val); extern int jso_add_int(JSON_OBJPTR obj, const char *key, int val); extern int jso_add_bool(JSON_OBJPTR obj, const char *key, boolean val); extern int jso_add_string_from_int(JSON_OBJPTR obj, const char *key, int val); extern int jso_add_double(JSON_OBJPTR obj, const char *key, double val); extern int jso_add_string_from_double(JSON_OBJPTR obj, const char *key, double val); extern int jso_add_int64(JSON_OBJPTR obj, const char *key, long long val); extern const char *jso_get_string_origin(JSON_OBJPTR obj); extern const char *jso_obj_get_string_origin(JSON_OBJPTR obj, const char *key); extern int jso_obj_get_int(JSON_OBJPTR obj, const char *key, int *pValue); extern int jso_obj_get_double(JSON_OBJPTR obj, const char *key, double *val); extern int jso_obj_get_int64(JSON_OBJPTR obj, const char *key, long long *val); extern JSON_OBJPTR jso_new_array(); extern boolean jso_is_double(JSON_OBJPTR obj); extern boolean jso_is_string(JSON_OBJPTR obj); extern boolean jso_is_int(JSON_OBJPTR obj); extern boolean jso_is_bool(JSON_OBJPTR obj); extern boolean jso_is_int64(JSON_OBJPTR obj); extern int jso_get_int(JSON_OBJPTR obj, int *pVal); extern int jso_get_double(JSON_OBJPTR obj, double *pVal); extern boolean jso_is_obj(JSON_OBJPTR obj); extern boolean jso_obj_is_null(JSON_OBJPTR obj, const char *key); extern boolean jso_is_array(JSON_OBJPTR obj); extern int jso_array_length(JSON_OBJPTR obj); extern int jso_array_add(JSON_OBJPTR obj, JSON_OBJPTR val); extern JSON_OBJPTR jso_array_get_idx(JSON_OBJPTR obj, int idx); extern int jso_array_del_idx(JSON_OBJPTR obj, int idx, int count); extern JSON_OBJPTR jso_get(JSON_OBJPTR obj); extern JSON_OBJPTR jso_get_obj_from_obj(JSON_OBJPTR obj, const char *key); extern int jso_transfer_to_array(JSON_OBJPTR *json_table); extern int jso_sub_obj_cnt(JSON_OBJPTR obj); extern int jso_obj_url_coding(JSON_OBJ *obj, int coding_type); extern int jso_array_url_coding(JSON_OBJ *array, int coding_type);
最新发布
08-28
详细注释#ifndef _ARP_REQUEST_H #define _ARP_REQUEST_H #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/ioctl.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> #include <netinet/if_ether.h> #include <net/ethernet.h> #include <net/if_arp.h> #include <net/if.h> #include <netpacket/packet.h> /* 以太网帧首部长度 */ #define ETHER_HEADER_LEN sizeof(struct ether_header) /* 整个arp结构长度 */ #define ETHER_ARP_LEN sizeof(struct ether_arp) /* 以太网 + 整个arp结构长度 */ #define ETHER_ARP_PACKET_LEN ETHER_HEADER_LEN + ETHER_ARP_LEN /* IP地址长度 */ #define IP_ADDR_LEN 4 /* 广播地址 */ #define BROADCAST_ADDR {0xff, 0xff, 0xff, 0xff, 0xff, 0xff} void err_exit(const char *err_msg); struct ether_arp *fill_arp_packet(const unsigned char *src_mac_addr, const char *src_ip, const char *dst_ip); void arp_request(const char *if_name, const char *dst_ip); #endif,,/* Copyright(c) * * file arp_request.c * brief This is a work of sending arp request. * * author Zhou Shijun * version 1.0.1 * date 24Aug28 * * history * * */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/ioctl.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> #include <netinet/if_ether.h> #include <net/ethernet.h> #include <net/if_arp.h> #include <net/if.h> #include <netpacket/packet.h> #include"arp_request.h" void err_exit(const char *err_msg) { perror(err_msg); exit(1); } /* 填充arp包 */ struct ether_arp *fill_arp_packet(const unsigned char *src_mac_addr, const char *src_ip, const char *dst_ip) { struct ether_arp *arp_packet; struct in_addr src_in_addr, dst_in_addr; unsigned char dst_mac_addr[ETH_ALEN] = BROADCAST_ADDR; /* IP地址转换 */ inet_pton(AF_INET, src_ip, &src_in_addr); inet_pton(AF_INET, dst_ip, &dst_in_addr); /* 整个arp包 */ arp_packet = (struct ether_arp *)malloc(ETHER_ARP_LEN); arp_packet->arp_hrd = htons(ARPHRD_ETHER); arp_packet->arp_pro = htons(ETHERTYPE_IP); arp_packet->arp_hln = ETH_ALEN; arp_packet->arp_pln = IP_ADDR_LEN; arp_packet->arp_op = htons(ARPOP_REQUEST); memcpy(arp_packet->arp_sha, src_mac_addr, ETH_ALEN); memcpy(arp_packet->arp_tha, dst_mac_addr, ETH_ALEN); memcpy(arp_packet->arp_spa, &src_in_addr, IP_ADDR_LEN); memcpy(arp_packet->arp_tpa, &dst_in_addr, IP_ADDR_LEN); return arp_packet; } /* arp请求 */ void arp_request(const char *if_name, const char *dst_ip) { struct sockaddr_ll saddr_ll; struct ether_header *eth_header; struct ether_arp *arp_packet; struct ifreq ifr; char buf[ETHER_ARP_PACKET_LEN]; unsigned char src_mac_addr[ETH_ALEN]; unsigned char dst_mac_addr[ETH_ALEN] = BROADCAST_ADDR; char *src_ip; int sock_raw_fd, ret_len, i; if ((sock_raw_fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ARP))) == -1) { err_exit("socket()"); } bzero(&saddr_ll, sizeof(struct sockaddr_ll)); bzero(&ifr, sizeof(struct ifreq)); /* 网卡接口名 */ memcpy(ifr.ifr_name, if_name, strlen(if_name)); /* 获取网卡接口索引 */ if (ioctl(sock_raw_fd, SIOCGIFINDEX, &ifr) == -1) { err_exit("ioctl() get ifindex"); } saddr_ll.sll_ifindex = ifr.ifr_ifindex; saddr_ll.sll_family = PF_PACKET; /* 获取网卡接口IP */ if (ioctl(sock_raw_fd, SIOCGIFADDR, &ifr) == -1) { err_exit("ioctl() get ip"); } src_ip = inet_ntoa(((struct sockaddr_in *)&(ifr.ifr_addr))->sin_addr); printf("local ip:%s\n", src_ip); /* 获取网卡接口MAC地址 */ if (ioctl(sock_raw_fd, SIOCGIFHWADDR, &ifr)) { err_exit("ioctl() get mac"); } memcpy(src_mac_addr, ifr.ifr_hwaddr.sa_data, ETH_ALEN); printf("local mac"); for (i = 0; i < ETH_ALEN; i++) { printf(":%0x", src_mac_addr[i]); } printf("\n"); bzero(buf, ETHER_ARP_PACKET_LEN); /* 填充以太首部 */ eth_header = (struct ether_header *)buf; memcpy(eth_header->ether_shost, src_mac_addr, ETH_ALEN); memcpy(eth_header->ether_dhost, dst_mac_addr, ETH_ALEN); eth_header->ether_type = htons(ETHERTYPE_ARP); /* arp包 */ arp_packet = fill_arp_packet(src_mac_addr, src_ip, dst_ip); memcpy(buf + ETHER_HEADER_LEN, arp_packet, ETHER_ARP_LEN); /* 发送请求 */ ret_len = sendto(sock_raw_fd, buf, ETHER_ARP_PACKET_LEN, 0, (struct sockaddr *)&saddr_ll, sizeof(struct sockaddr_ll)); if (ret_len > 0) { printf("Send successfully!\n"); } close(sock_raw_fd); } LOCAL void arp_request_main(int argc, const char *argv[]) { if (argc != 3) { printf("usage:%s device_name dst_ip\n", argv[0]); exit(1); } arp_request(argv[1], argv[2]); return 0; } NSD_INIT(arp_request_main);
08-27
给我详细注释#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/ioctl.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> #include <netinet/if_ether.h> #include <net/ethernet.h> #include <net/if_arp.h> #include <net/if.h> #include <netpacket/packet.h> #include"arp_request.h" void err_exit(const char *err_msg) { perror(err_msg); exit(1); } /* 填充arp请求包 */ struct ether_arp *fill_arp_packet(const unsigned char *src_mac_addr, const char *src_ip, const char *dst_ip) { struct ether_arp *arp_packet; struct in_addr src_in_addr, dst_in_addr; unsigned char dst_mac_addr[ETH_ALEN] = BROADCAST_ADDR; /* 目标MAC广播 */ /* IP地址转换 */ inet_pton(AF_INET, src_ip, &src_in_addr); inet_pton(AF_INET, dst_ip, &dst_in_addr); /* 整个arp包 */ arp_packet = (struct ether_arp *)malloc(ETHER_ARP_LEN); arp_packet->arp_hrd = htons(ARPHRD_ETHER); arp_packet->arp_pro = htons(ETHERTYPE_IP); arp_packet->arp_hln = ETH_ALEN; arp_packet->arp_pln = IP_ADDR_LEN; arp_packet->arp_op = htons(ARPOP_REQUEST); memcpy(arp_packet->arp_sha, src_mac_addr, ETH_ALEN); memcpy(arp_packet->arp_tha, dst_mac_addr, ETH_ALEN); memcpy(arp_packet->arp_spa, &src_in_addr, IP_ADDR_LEN); memcpy(arp_packet->arp_tpa, &dst_in_addr, IP_ADDR_LEN); return arp_packet; } /* arp请求 */ void arp_request(const char *if_name, const char *dst_ip) { struct sockaddr_ll saddr_ll; struct ether_header *eth_header; struct ether_arp *arp_packet; struct ifreq ifr; char buf[ETHER_ARP_PACKET_LEN]; unsigned char src_mac_addr[ETH_ALEN]; unsigned char dst_mac_addr[ETH_ALEN] = BROADCAST_ADDR; char *src_ip; int sock_raw_fd, ret_len, i; if ((sock_raw_fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ARP))) == -1) { err_exit("socket()"); } bzero(&saddr_ll, sizeof(struct sockaddr_ll)); bzero(&ifr, sizeof(struct ifreq)); /* 网卡接口名 */ memcpy(ifr.ifr_name, if_name, strlen(if_name)); /* 获取网卡接口索引 */ if (ioctl(sock_raw_fd, SIOCGIFINDEX, &ifr) == -1) { err_exit("ioctl() get ifindex"); } saddr_ll.sll_ifindex = ifr.ifr_ifindex; saddr_ll.sll_family = PF_PACKET; /* 获取网卡接口IP */ if (ioctl(sock_raw_fd, SIOCGIFADDR, &ifr) == -1) { err_exit("ioctl() get ip"); } src_ip = inet_ntoa(((struct sockaddr_in *)&(ifr.ifr_addr))->sin_addr); printf("local ip:%s\n", src_ip); /* 获取网卡接口MAC地址 */ if (ioctl(sock_raw_fd, SIOCGIFHWADDR, &ifr)) { err_exit("ioctl() get mac"); } memcpy(src_mac_addr, ifr.ifr_hwaddr.sa_data, ETH_ALEN); printf("local mac"); for (i = 0; i < ETH_ALEN; i++) { printf(":%0x", src_mac_addr[i]); } printf("\n"); bzero(buf, ETHER_ARP_PACKET_LEN); /* 填充以太首部 */ eth_header = (struct ether_header *)buf; memcpy(eth_header->ether_shost, src_mac_addr, ETH_ALEN); memcpy(eth_header->ether_dhost, dst_mac_addr, ETH_ALEN); eth_header->ether_type = htons(ETHERTYPE_ARP); /* arp包 */ arp_packet = fill_arp_packet(src_mac_addr, src_ip, dst_ip); memcpy(buf + ETHER_HEADER_LEN, arp_packet, ETHER_ARP_LEN); /* 发送请求 */ ret_len = sendto(sock_raw_fd, buf, ETHER_ARP_PACKET_LEN, 0, (struct sockaddr *)&saddr_ll, sizeof(struct sockaddr_ll)); if (ret_len > 0) { printf("Send successfully!\n"); } close(sock_raw_fd); } LOCAL void arp_request_main(int argc, const char *argv[]) { if (argc != 3) { printf("usage:%s device_name dst_ip\n", argv[0]); exit(1); } arp_request(argv[1], argv[2]); return 0; } NSD_INIT(arp_request_main);
08-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值