- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
嗨,我正在尝试获取访问我们内部门户的机器的本地 IP 地址,我需要 IP 192.168.xx.xx,我尝试使用可能的解决方案,例如
$myIp = getHostByName(getHostName());
$_SERVER['REMOTE_ADDR']
$_SERVER['REMOTE_HOST']
function getLocalIP(){
exec("ipconfig /all", $output);
foreach($output as $line){
if (preg_match("/(.*)IPv4 Address(.*)/", $line)){
$ip = $line;
$ip = str_replace("IPv4 Address. . . . . . . . . . . :","",$ip);
$ip = str_replace("(Preferred)","",$ip);
}
}
return $ip;
}
甚至还有一些来自引用的解决方案
How do I get the local IP address of the server using PHP? , how to get local computer ip address in php , Get Local Machine IP Address in PHP
但是没有任何方法可以得到所需的解决方案?有什么建议吗?
最佳答案
通常,您将无法检索位于 NAT 路由器/防火墙后面的任何计算机的本地 ip 地址
,尤其是在服务器上运行的 PHP 时尤其如此,因此上面的代码会找到服务器的ip。
但是,您可以使用 Javascript 和 webRTC
中的一项功能来显示门户访问者的本地 IP 地址。如果需要,可以使用 Ajax 将其结果传递给 PHP。几周前我在调查连接问题时发现了这一点——我访问的一个站点显示了我的公共(public)和本地 IP 地址。在查看源代码并进行进一步研究后,我将以下小函数放在一起 - 也许它可能有用。
<?php
?>
<!doctype html>
<html>
<head>
<meta charset='utf-8' />
<title>Get Local IP address</title>
<script>
const rtcpip=function( server, callback ){
/*
https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/createDataChannel
https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/createOffer
*/
let debug=true;
let oList={
google1:'stun1.l.google.com:19302',
google2:'stun2.l.google.com:19302',
google3:'stun3.l.google.com:19302',
google4:'stun4.l.google.com:19302',
kundenserver:'stun.kundenserver.de:3478',
mozilla:'stun.services.mozilla.com:3478',
notts:'stun.nottingham.ac.uk:3478'
};
const getserver=function(){
return oList.hasOwnProperty( server ) ? oList[ server ] : oList.mozilla;
};
let duplicates={};
let stunsvr=getserver();
let RTCPeerConnection=window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
let oConstraints={ optional: [ { RtpDataChannels: true } ] };
let oServers = { iceServers: [ { urls: 'stun:' + stunsvr } ] };
const info=function(m){
if( arguments.length==1 && debug )console.info(m);
if( arguments.length==2 && debug )console.info(m,arguments[1]);
};
const candidatehandler=function( candidate ){
info( candidate );
let regex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/
let addr = regex.exec( candidate )[1];
if( duplicates[ addr ] === undefined ) callback( addr );
duplicates[ addr ] = true;
};
const icelistener=function( oIce ){
if( oIce.candidate ) candidatehandler.call( this, oIce.candidate.candidate );
};
const icedclistener=function(e){
let oChan=e.channel;
oChan.addEventListener( 'open', function( evt ){ info( evt ) }, false );
oChan.addEventListener( 'message', function( evt ){ info( evt.data ) }, false );
oChan.addEventListener( 'close', function( evt ){ info( evt ) }, false );
};
const icecslistener=function(e){
info( 'connectionstatechange: %o',e );
};
const icenegotiate=function( e ){
info( 'icenegotiate: %o',e );
};
const icesignalchange=function(e){
info( 'icesignalchange: %o',e );
};
const icetrack=function(e){
info( 'icetrack: %o',e );
}
info( 'STUN Server: %s', stunsvr );
let rtcp=new RTCPeerConnection( oServers, oConstraints );
rtcp.addEventListener( 'icecandidate', icelistener, false );
rtcp.addEventListener( 'datachannel', icedclistener, false );
rtcp.addEventListener( 'iceconnectionstatechange', icecslistener, false );
rtcp.addEventListener( 'negotiationneeded', icenegotiate, false );
rtcp.addEventListener( 'signalingstatechange', icesignalchange, false );
rtcp.addEventListener( 'track', icetrack, false );
rtcp.createDataChannel( 'rtcpip' );
rtcp.createOffer().then( function( offer ){
return rtcp.setLocalDescription( offer )
} ).then( function(){
let lines = rtcp.localDescription.sdp.split( String.fromCharCode( 10 ) );
lines.forEach( function( line ){
if( ~line.indexOf( 'a=candidate:' ) ) candidatehandler.call( this, line );
});
});
};
const create=function(t, a, p){
try{
var el = ( typeof( t )=='undefined' || t==null ) ? document.createElement( 'div' ) : document.createElement( t );
for( var x in a ) if( a.hasOwnProperty( x ) && x!=='innerHTML' ) el.setAttribute( x, a[ x ] );
if( a.hasOwnProperty('innerHTML') ) el.innerHTML=a.innerHTML;
if( p!=null ) typeof( p )=='object' ? p.appendChild( el ) : document.getElementById( p ).appendChild( el );
return el;
}catch( err ){
console.warn( err.message );
}
};
const ipcallback=function( ip ){
try{
let type=false;
let ipv4=ip.split('.');
let ipv6=ip.split(':');
if( ipv4.length==4 ){
let local=( ipv4[0] == 10 || ( ipv4[0]==172 && ( ipv4[1]>=16 &&ipv4[1]<=31 ) ) || ( ipv4[0]==192 && ipv4[1]==168 ) );
create( null,{ innerHTML:ip + ( local ? ' - Private' : ' - Public' ) }, document.getElementById( 'ip' ) );
}
if( ipv6.length > 1 ){
switch( ipv6[0] ){
case 'FE80':type='Link-Local';break;
case 'FEC0':type='site-local';break;
case '3FFE':type='global';break;
case '2002':type='global 6to4';break;
default:type='IPV6';break;
}
create( null,{ innerHTML:ip + ' ' + type }, document.getElementById( 'ip' ) );
/*
you can use this callback to pass the ip address information on to a php script
or do something more interesting
*/
}
}catch( err ){
console.info( err.message )
}
}
rtcpip.call( this, 'google1', ipcallback );
</script>
<style>
body{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100vh;width:100%;padding:0;margin:0;font-family:calibri,verdana,arial;font-size:1rem;}
#ip{display:flex;align-items:center;justify-content:center;flex-direction:column;width:50%;min-height:5rem;height:auto;box-sizing:border-box;border:2px dashed rgba(133,133,133,0.25);border-radius:1rem;color:rgba(133,133,133,0.95);box-shadow: 0 10px 25px rgba(133,133,133,0.95);text-align:center;margin:0 auto;float:none;background:whitesmoke}
</style>
</head>
<body>
<div id='ip'></div>
</body>
</html>
关于php - 无法从托管在 GODADDY 上的站点获取机器的本地 IP 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52289423/
我通过 spring ioc 编写了一些 Rest 应用程序。但我无法解决这个问题。这是我的异常(exception): org.springframework.beans.factory.BeanC
我对 TestNG、Spring 框架等完全陌生,我正在尝试使用注释 @Value通过 @Configuration 访问配置文件注释。 我在这里想要实现的目标是让控制台从配置文件中写出“hi”,通过
为此工作了几个小时。我完全被难住了。 这是 CS113 的实验室。 如果用户在程序(二进制计算器)结束时选择继续,我们需要使用 goto 语句来到达程序的顶部。 但是,我们还需要释放所有分配的内存。
我正在尝试使用 ffmpeg 库构建一个小的 C 程序。但是我什至无法使用 avformat_open_input() 打开音频文件设置检查错误代码的函数后,我得到以下输出: Error code:
使用 Spring Initializer 创建一个简单的 Spring boot。我只在可用选项下选择 DevTools。 创建项目后,无需对其进行任何更改,即可正常运行程序。 现在,当我尝试在项目
所以我只是在 Mac OS X 中通过 brew 安装了 qt。但是它无法链接它。当我尝试运行 brew link qt 或 brew link --overwrite qt 我得到以下信息: ton
我在提交和 pull 时遇到了问题:在提交的 IDE 中,我看到: warning not all local changes may be shown due to an error: unable
我跑 man gcc | grep "-L" 我明白了 Usage: grep [OPTION]... PATTERN [FILE]... Try `grep --help' for more inf
我有一段代码,旨在接收任何 URL 并将其从网络上撕下来。到目前为止,它运行良好,直到有人给了它这个 URL: http://www.aspensurgical.com/static/images/a
在过去的 5 个小时里,我一直在尝试在我的服务器上设置 WireGuard,但在完成所有设置后,我无法 ping IP 或解析域。 下面是服务器配置 [Interface] Address = 10.
我正在尝试在 GitLab 中 fork 我的一个私有(private)项目,但是当我按下 fork 按钮时,我会收到以下信息: No available namespaces to fork the
我这里遇到了一些问题。我是 node.js 和 Rest API 的新手,但我正在尝试自学。我制作了 REST API,使用 MongoDB 与我的数据库进行通信,我使用 Postman 来测试我的路
下面的代码在控制台中给出以下消息: Uncaught DOMException: Failed to execute 'appendChild' on 'Node': The new child el
我正在尝试调用一个新端点来显示数据,我意识到在上一组有效的数据中,它在数据周围用一对额外的“[]”括号进行控制台,我认为这就是问题是,而新端点不会以我使用数据的方式产生它! 这是 NgFor 失败的原
我正在尝试将我的 Symfony2 应用程序部署到我的 Azure Web 应用程序,但遇到了一些麻烦。 推送到远程时,我在终端中收到以下消息 remote: Updating branch 'mas
Minikube已启动并正在运行,没有任何错误,但是我无法 curl IP。我在这里遵循:https://docs.traefik.io/user-guide/kubernetes/,似乎没有提到关闭
每当我尝试docker组成任何项目时,都会出现以下错误。 我尝试过有和没有sudo 我在这台机器上只有这个问题。我可以在Mac和Amazon WorkSpace上运行相同的容器。 (myslabs)
我正在尝试 pip install stanza 并收到此消息: ERROR: No matching distribution found for torch>=1.3.0 (from stanza
DNS 解析看起来不错,但我无法 ping 我的服务。可能是什么原因? 来自集群中的另一个 Pod: $ ping backend PING backend.default.svc.cluster.l
我正在使用Hibernate 4 + Spring MVC 4当我开始 Apache Tomcat Server 8我收到此错误: Error creating bean with name 'wel
我是一名优秀的程序员,十分优秀!