在搭建本地环境的时候,需要用到多个设备,有服务器、打印机连接接设备等。因为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. git忽略文件

    .gitignore文件配置 ###################### # Project Specific ###################### /src/main/webapp/dis ...

  2. Java SpringMVC 定时任务

    1.web.xml 2.spring-mvc.xml <?xml version="1.0" encoding="UTF-8"?> <bean ...

  3. iOS10 相册权限

    当我升级到Xcode8后,启动我的相机项目,直接crash,输出的日志如下: '2016-07-08 16:41:11.268943 project-name[362:56625] [MC] Syst ...

  4. sqlserver 存储过程 增加

    CREATE PROCEDURE [dbo].[InsertMessage]( @strTable varchar(), --表名 @strValues nvarchar(), --要插入的数据(用英 ...

  5. apache故障处理

    注意:修改虚拟机主机html路径不需要修改主配置这一行. DocumentRoot "/var/www" 1.Permission denied: [client 10.10.2. ...

  6. 6.Nginx作为负载均衡服务器应用

    案例:Nginx作为负载均衡服务器应用 nginx的负载均衡功能是通过upstream命令实现的,因此他的负载均衡机制比较简单,是一个基于内容和应用的7层交换负载均衡的实现.Nginx负载均衡默认对后 ...

  7. 在亚马逊linux环境上装mysql+添加启动项

    安装mysql sudo yum install mysql sudo yum install mysql-server sudo yum install mysql-devel 添加到系统启动项su ...

  8. React Native出现"Native module cannot be null"问题

    经查跟PushNotification有关,需要手动完成Linking. 两步解决此问题: 配置Linking Libraries:https://facebook.github.io/react-n ...

  9. 安装两个JDK后配置环境变量没用?

    在实际开发中,由于项目的需要,可能JDK的版本是不同的.比如我们前一个项目所需JDK版本是1.6的,项目完成后,下一个项目JDK版本又是需要1.7的,为了防止由于切换项目我们需要频繁的安装卸载JDK, ...

  10. TCP/IP协议栈(三)——linux 向下的报文处理

    应用程序连接服务器时,目的地套接字地址(端口号和IP地址)以参数形式传递给系统调用connect(tcp_v4_connect()).下面逐步介绍初始化该连接 检查内核路由表,查找给定目的地IP地址路 ...