Xcode 获取本地IP
//
// GetIPAddress.h //
// #define MAXADDRS 32 extern char *ip_names[MAXADDRS]; void InitAddresses();
void GetIPAddresses();
void GetHWAddresses();
//
// GetIPAddress.m// #include "GetIPAddress.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <sys/sockio.h>
#include <net/ethernet.h>
#include <net/if.h>
#include <errno.h>
#include <net/if_dl.h> #define min(a,b) ((a) < (b) ? (a) : (b))
#define max(a,b) ((a) > (b) ? (a) : (b)) #define BUFFERSIZE 4000 char *if_names[MAXADDRS];
char *ip_names[MAXADDRS];
char *hw_addrs[MAXADDRS];
unsigned long ip_addrs[MAXADDRS]; static int nextAddr = ; void InitAddresses();
void FreeAddresses();
void GetIPAddresses();
void GetHWAddresses(); void InitAddresses() {
int i;
for (i=; i<MAXADDRS; ++i) {
if_names[i] = ip_names[i] = hw_addrs[i] = NULL;
ip_addrs[i] = ;
}
} void FreeAddresses() {
int i;
for (i=; i<MAXADDRS; ++i) {
if (if_names[i] != ) free(if_names[i]);
if (ip_names[i] != ) free(ip_names[i]);
if (hw_addrs[i] != ) free(hw_addrs[i]);
ip_addrs[i] = ;
}
InitAddresses();
} void GetIPAddresses() {
int i, len, flags;
char buffer[BUFFERSIZE], *ptr, lastname[IFNAMSIZ], *cptr;
struct ifconf ifc;
struct ifreq *ifr, ifrcopy;
struct sockaddr_in *sin; char temp[]; int sockfd; for (i=; i<MAXADDRS; ++i) {
if_names[i] = ip_names[i] = NULL;
ip_addrs[i] = ;
} sockfd = socket(AF_INET, SOCK_DGRAM, );
if (sockfd < ) {
perror("socket failed");
return;
} ifc.ifc_len = BUFFERSIZE;
ifc.ifc_buf = buffer; if (ioctl(sockfd, SIOCGIFCONF, &ifc) < ) {
perror("ioctl error");
return;
} lastname[] = ;
nextAddr = ;
for (ptr = buffer; ptr < buffer + ifc.ifc_len; ) {
ifr = (struct ifreq *)ptr;
len = max(sizeof(struct sockaddr), ifr->ifr_addr.sa_len);
ptr += sizeof(ifr->ifr_name) + len; // for next one in buffer if (ifr->ifr_addr.sa_family != AF_INET) {
continue; // ignore if not desired address family
} if ((cptr = (char *)strchr(ifr->ifr_name, ':')) != NULL) {
*cptr = ; // replace colon will null
} if (strncmp(lastname, ifr->ifr_name, IFNAMSIZ) == ) {
continue; /* already processed this interface */
} memcpy(lastname, ifr->ifr_name, IFNAMSIZ); ifrcopy = *ifr;
ioctl(sockfd, SIOCGIFFLAGS, &ifrcopy);
flags = ifrcopy.ifr_flags;
if ((flags & IFF_UP) == ) {
continue; // ignore if interface not up
} if_names[nextAddr] = (char *)malloc(strlen(ifr->ifr_name)+);
if (if_names[nextAddr] == NULL) {
return;
}
strcpy(if_names[nextAddr], ifr->ifr_name); sin = (struct sockaddr_in *)&ifr->ifr_addr;
strcpy(temp, inet_ntoa(sin->sin_addr)); ip_names[nextAddr] = (char *)malloc(strlen(temp)+);
if (ip_names[nextAddr] == NULL) {
return;
}
strcpy(ip_names[nextAddr], temp); ip_addrs[nextAddr] = sin->sin_addr.s_addr; ++nextAddr;
} close(sockfd);
} void GetHWAddresses() {
struct ifconf ifc;
struct ifreq *ifr;
int i, sockfd;
char buffer[BUFFERSIZE], *cp, *cplim;
char temp[]; for (i=; i<MAXADDRS; ++i) {
hw_addrs[i] = NULL;
} sockfd = socket(AF_INET, SOCK_DGRAM, );
if (sockfd < ) {
perror("socket failed");
return;
} ifc.ifc_len = BUFFERSIZE;
ifc.ifc_buf = buffer; if (ioctl(sockfd, SIOCGIFCONF, (char *)&ifc) < ) {
perror("ioctl error");
close(sockfd);
return;
} ifr = ifc.ifc_req; cplim = buffer + ifc.ifc_len; for (cp=buffer; cp < cplim; ) {
ifr = (struct ifreq *)cp;
if (ifr->ifr_addr.sa_family == AF_LINK) {
struct sockaddr_dl *sdl = (struct sockaddr_dl *)&ifr->ifr_addr;
int a,b,c,d,e,f;
int i; strcpy(temp, (char *)ether_ntoa((const struct ether_addr *)LLADDR(sdl)));
sscanf(temp, "%x:%x:%x:%x:%x:%x", &a, &b, &c, &d, &e, &f);
sprintf(temp, "%02X:%02X:%02X:%02X:%02X:%02X",a,b,c,d,e,f); for (i=; i<MAXADDRS; ++i) {
if ((if_names[i] != NULL) && (strcmp(ifr->ifr_name,if_names[i]) == )) {
if (hw_addrs[i] == NULL) {
hw_addrs[i] = (char *)malloc(strlen(temp)+);
strcpy(hw_addrs[i], temp);
break;
}
}
}
}
cp += sizeof(ifr->ifr_name) + max(sizeof(ifr->ifr_addr), ifr->ifr_addr.sa_len);
} close(sockfd);
}
Xcode 获取本地IP的更多相关文章
- Linux编程获取本地IP
#include <stdio.h> #include <sys/types.h> #include <ifaddrs.h> #include <netine ...
- Java获取本地IP地址
import java.net.InetAddress; import java.net.UnknownHostException; public class IpTest { public stat ...
- 获取本地IP地址信息
2012-06-05 /// <summary> /// 获取本地IP地址信息 /// </summary> void G ...
- Android应用开发提高篇(1)-----获取本地IP
链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/21/2361802.html 一.概述 习惯了Linux下的网络编程,在还没用智能机之前就一直想 ...
- C# — 动态获取本地IP地址及可用端口
1.在VS中动态获取本地IP地址,代码如下: 2.获取本机的可用端口以及已使用的端口:
- .net获取本地ip地址
整理代码,.net获取本地ip地址,代码如下: string name = Dns.GetHostName(); IPHostEntry IpEntry = Dns.GetHostEntry(name ...
- 获取本地IP地址的vc代码
作者:朱金灿 来源:http://blog.csdn.net/clever101 获取本地IP地址有两种做法.一种是使用gethostname函数,代码如下: bool CSocketComm::Ge ...
- 获取本地ip和获取公网ip
import socket def get_local_ip(): ''' 获取本地ip地址 :return: ''' s = socket.socket(socket.AF_INET, socket ...
- Linux C 网络编程 - 获取本地 ip 地址,mac,通过域名获取对应的 ip
获取本地 ip 地址,mac,通过域名获取对应的 ip, 是网络编程可能遇到的比较常见的操作了,所以总结如下(封装了3个函数), 直接上代码: #include <stdio.h> #in ...
随机推荐
- 10个linux网络和监控命令
我下面列出来的10个基础的每个linux用户都应该知道的网络和监控命令.网络和监控命令类似于这些: hostname, ping, ifconfig, iwconfig, netstat, nsloo ...
- 【Python】Python网络编程
python内置封装了很多常见的网络协议的库,因此python成为了一个强大的网络编程工具,这里是对python的网络方面编程的一个简单描述. urllib 和 urllib2模块 urllib 和u ...
- ZOJ3113_John
这个题目是一个典型的Anti_Sg.我也不知道为什么这么叫,呵呵,反正大家都这么叫,而且我也是听别人说,看别人的日志自己才知道的. 题目的意思是给你不同颜色的石子,每次可以去一种颜色的石子若干个(至少 ...
- C++解析(12):初始化列表与对象构造顺序、析构顺序
0.目录 1.类成员的初始化 2.类中的const成员 3.对象的构造顺序 3.1 局部对象的构造顺序 3.2 堆对象的构造顺序 3.3 全局对象的构造顺序 4.对象的析构顺序 5.小结 1.类成员的 ...
- StringUtils工具类说明
/***************************************为空判断***************************************/ //null 和 " ...
- DjangoORM外键操作
Django ORM 外键操作 经常修改的东西一般不放到内存里面,而是放到一张表里.表跟表之间是可以存在关系的,最基本的就是一对多的关系. models.ForeignKey(ColorDic) 1. ...
- Mybatis笔记三:iBatis与MyBatis区别
转载:http://www.tuicool.com/articles/auaAru iBatis 框架的主要优势: 1.iBatis 封装了绝大多数的 JDBC 样板代码,使得开发者只需关注 SQL ...
- URAL1519 Formula 1 【插头dp】
题目链接 URAL1519 题解 看题型显然插头\(dp\) 考虑如何设计状态 有这样一个方案 当我们决策到某个位置 轮廓线长这样 你会发现插头一定是相互匹配的 所以我们实际上可以把状态用括号序列表示 ...
- for程序员:这些你可能遇到的职场难题,我们帮你整理好了答案
“迷茫”是当下青年谈论的最多的词汇之一,无论高矮胖瘦富穷美丑,每个人都有自己独特的难题.造成“迷茫”的原因有很多种,比如生存压力,情感问题,以及困扰着相当一部分人的职场焦虑.今天这篇关于“职场迷茫”的 ...
- ubuntu 安装微信开发者工具
https://github.com/cytle/wechat_web_devtools 实测:64位 32位的可以... 参考命令; 2030 sudo apt-get install wine1 ...