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 ...
随机推荐
- 关于解决java读取excel文件遇空行抛空指针的问题 !
关于解决java读取excel文件遇空行抛空指针的问题 ! package exceRead; import java.io.File; import java.io.FileInputStream; ...
- 【EF】EF Code-First数据迁移
Code-First数据迁移 首先要通过NuGet将EF升级至最新版本. 新建MVC 4项目MvcMigrationDemo 添加数据模型 Person 和 Department,定义如下: usi ...
- 【uoj#244】[UER #7]短路 CDQ分治+斜率优化dp
题目描述 给出 $(2n+1)\times (2n+1)$ 个点,点 $(i,j)$ 的权值为 $a[max(|i-n-1|,|j-n-1|)]$ ,找一条从 $(1,1)$ 走到 $(2n+1,2n ...
- 【比赛】HNOI2018 毒瘤
虚树+dp 直接看zlttttt的强大题解 zlttttt的题解看这里 #include<bits/stdc++.h> #define ui unsigned int #define ll ...
- 【HDU4336】Card Collector (动态规划,数学期望)
[HDU4336]Card Collector (动态规划,数学期望) 题面 Vjudge 题解 设\(f[i]\)表示状态\(i\)到达目标状态的期望 \(f[i]=(\sum f[j]*p[j]+ ...
- Splay 的区间操作
学完Splay的查找作用,发现和普通的二叉查找树没什么区别,只是用了splay操作节省了时间开支. 而Splay序列之王的称号可不是白给的. Splay真正强大的地方是他的区间操作. 怎么实现呢? 我 ...
- 【ZJOI2005】沼泽鳄鱼 题解报告
题目描述 潘塔纳尔沼泽地号称世界上最大的一块湿地,它地位于巴西中部马托格罗索州的南部地区.每当雨季来临,这里碧波荡漾.生机盎然,引来不少游客. 为了让游玩更有情趣,人们在池塘的中央建设了几座石墩和石桥 ...
- SQL中的替换函数replace()使用
语法REPLACE ( string_expression , string_pattern , string_replacement ) 参数string_expression 要搜索的字符串表达式 ...
- http_load - 集成测试工具之
http_load是基于linux平台的性能测试工具,它体积非常小,仅100KB.它以并行复用的方式运行,可以测试web服务器的吞吐量与负载. 1 官方地址 http://www.acme.com/ ...
- 【Nowcoder】玩游戏
Portal --> Nowcoder197D Solution 所以说这是一道==纯粹的人类智慧题是这样吗qwq 一开始的时候想sg函数qwq然后发现..好像根本不能拆成独立的子游戏嘛qw ...