在搭建本地环境的时候,需要用到多个设备,有服务器、打印机连接接设备等。因为DHCP动态分配IP,所以每次重连都会发生IP地址的变更。

解决办法就是将每个设备的本机IP上传到统一的地方保存。因为使用REMOTE_ADDR和HTTP_X_FORWARDED_FOR等方法获取到的有可能是客户端使用的代理服务器的IP地址,并非真正的本机IP,解决办法就是针对mac下的查看IP地址命令:ifconfig 和 windows下的ipconfig,然后使用正则表达式从中获取到ip地址信息。

主要用到正则和exec方法。

<?php
$server = 'http://server.com/admin.php/xxx';
$agent = $_SERVER['HTTP_USER_AGENT'];
$os = '';
if (strpos($agent, 'Macintosh') !== false) {
$os = 'mac';
}else{
$os = 'win';
}
switch ($os) {
case 'mac':
uploadMacIP();
break;
case 'win':
uploadWinIP();
default:
echo '未知操作系统类型';
break;
} function uploadMacIP()
{
exec("whereis ifconfig",$out);
$command = $out[0]." en0";
exec($command, $output);
$ip = '';
foreach ($output as $k => $v) {
if(preg_match("/inet [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/", $v, $matches)){
if($matches[0]){
$ip = str_replace("inet ", "", $matches[0]);
}
}
}
if(!empty($ip)){
uploadIP($ip,'mac');
}
}
function uploadWinIP()
{
$command = "ipconfig";
exec($command, $output);
$ip = '';
foreach ($output as $k => $v) {
if(preg_match("/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/", $v, $matches)){
if($matches[0]){
$ip = $matches[0];
}
}
}
if(!empty($ip)){
uploadIP($ip,'win');
}
}
function uploadIP($ip,$os)
{
$type = ['mac'=>1,'win'=>2];
$data = [
'ip' => $ip,
'type' => $type[$os],
];
$url = $server.'/add-ip'; if(curl_post($url, $data)){
echo '<h1>IP地址上传成功</h1>';
}else{
echo '<h1>IP地址上传失败</h1>';
}
}
function curl_post($url,$data)
{
$url .= "?data=".json_encode($data);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
$server_output = curl_exec($ch);
$info = curl_getinfo($ch); curl_close($ch);
if($server_output == "OK"){
return true;
}else{
return false;
}
}
?>

PHP获取DHCP分配的本机IP的更多相关文章

  1. 如何禁止虚拟机自动获取DHCP分配的ip地址

    今天在看Hadoop视频学习的时候跟着视频里面修改ip地址,将虚拟机的ip地址修改为192.168.2.3,结果ifconfig显示ip地址为192.168.2.128,用物理主机去ping这两个ip ...

  2. html利用j获取局域网内的本机IP(根据客户端浏览器的ip获取)

    根据客户端浏览器的ip获取 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type ...

  3. [转]详述DHCP服务器的三种IP分配方式

    DHCP就是动态主机配置协议(Dynamic Host Configuration Protocol),它的目的就是为了减轻TCP/IP网络的规划.管理和维护的负担,解决IP地址空间缺乏问题.这种网络 ...

  4. 获取 dhcp IP 过程分析 - 每天5分钟玩转 OpenStack(91)

    前面我们已经讨论了 DHCP agent 的配置以及 namespace 如何隔离 dnsmasq 服务,本节将以 cirros-vm1 为例分析获取 DHCP IP 的详细过程. 在创建 insta ...

  5. 获取本机IP地址

    这里有两种方法: //获取本机IP - (NSString *)localIPAddress { NSString *localIP = nil; struct ifaddrs *addrs; ) { ...

  6. .net中c#获取本机IP地址实例代码

    * 在使用前,一定要注意在头部加上引用: using System.Net; 代码如下: using System; using System.Collections.Generic; using S ...

  7. python未知网卡名情况下获取本机IP

    import socket def get_ip(): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) try: # doesn't even ...

  8. 关于是用dotnet获取本机IP地址+计算机名的方法

    印象中在maxscript帮助文档里找到过方法,但是当时没记下来.只能通过dotnet实现了. 如果电脑有无线网卡和本地连接,可能会出现乱码,也问了写dotnet的朋友,提供了一些思路,不过最终还是使 ...

  9. Oracle 支持在具有 DHCP 分配的 IP 地址的系统上进行安装

    今天在安装Oracle 10g的时候,遇到了“ Oracle 支持在具有 DHCP 分配的 IP 地址的系统上进行安装” 这个问题,经过搜索,找到了解决方案,具体如下: win7下右键单机" ...

随机推荐

  1. Idea中右边的maven projects窗口找不到了如何调出来

    关于Idea中右边的maven  projects窗口找不到了如何调出来? 具体的idea版本我不太清楚,我用的是2016版,其他版本应该也是一样的. 首先idea自带了maven控件,不像Eclip ...

  2. EntityFramework Core数据查询

    前言 本节我们再来讲讲EF Core,本节算是回归基础吧,当前项目EF Core还是处于1.1版本中,后续等待.net core等版本稳定了全部会更新到2.0版本中,到时再来更新相关文章分享给大家. ...

  3. C语言课程设计(成绩管理系统)

    C语言课程设计(成绩管理系统) 翻到了大学写的C语言课程设计,缅怀一下 内容: 增加学生成绩 查询学生成绩 删除 按照学生成绩进行排序 等 #include <stdio.h> #incl ...

  4. Python学习日记:day9--------函数

    初识函数 1,自定义函数 s ='内容' #自定义函数 def my_len():#自定义函数没有参数 i =0 for k in s: i+=1 print(i) return i #返回值 my_ ...

  5. java.util.ConcurrentHashMap (JDK 1.8)

    1.1 java.util.ConcurrentHashMap继承结构 ConcurrentHashMap和HashMap的实现有很大的相似性,建议先看HashMap源码,再来理解Concurrent ...

  6. C 函数参数 char **s与char *s[]

    本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/126 先来看一个小例子 : 编写函数遍历一个整型数组的元素,数组 ...

  7. 清北学堂 NOIP2017模拟赛 越赛越心塞

    连续考了一个星期发现自己真的是手感型选手,成绩全靠天意.手感好了码出200+也没什么问题,推出式子并且打出自己都不信的操作也有过.手感差了......就一个呵呵二字. 然后开始是T总让我们休息了一个星 ...

  8. ecshop 属性表(attribute)商品属性表(goods_attr)货品表(prduct) 商品数量的联系

    ecshop 属性表(attribute)商品属性表(goods_attr)货品表(prduct) 商品数量的联系 一个商城的商品属性存放在属性表(attribute)里 ,每个商品对应的属性在goo ...

  9. chattr 命令详解

    chattr   作用: 改变文件属性,这项指令可改变存放在ext2文件系统上的文件或目录属性,这些属性共有一下8种模式 模式: a: 让文件或目录仅供附加用途 b: 不更新文件或目录的最后存取时间 ...

  10. Yum database disk image is malformed

    使用 yum update 时使用Ctrl+C 后,再用yum 安装其他软件的时候收到:Yum database disk image is malformedyum clean dbcache 清除 ...