我正在创建一个应用程序,在JavaScript中经常(大约每秒)获取客户端的IP地址。 由于可能的BAN,如果可以的话,我不想使用提供客户端IP地址的服务,例如l2.io。 另外,如果可以的话,我不想准备在我的网络服务器上提供客户端IP地址的API。
我发现WebRTC有助于解决问题,并尝试使用WebRTC编写获取客户端IP地址的函数。 似乎该函数运行良好,但我发现该函数导致内存泄漏。
以下是我的代码导致Chrome 47中的内存泄漏。
function getIpAddress() {
return new Promise((resolve, reject) => {
var RTCPeerConnection = window.RTCPeerConnection
|| window.mozRTCPeerConnection
|| window.webkitRTCPeerConnection;
var pc = new RTCPeerConnection({
iceServers: [{urls: "stun:stun.services.mozilla.com"}]
}, {
optional: [{RtpDataChannels: true}]
});
pc.onicecandidate = ice => {
if (pc.iceGatheringState == "complete" && ice.candidate === null) { // waiting for completion
resolve(pc.localDescription.sdp.split("\r\n").filter(line => line.indexOf("c=") == 0)[0].split(" ")[2]);
if (pc.signalingState != "closed") pc.close();
}
};
pc.createDataChannel("");
pc.createOffer(result => {
pc.setLocalDescription(result, function () {}, function () {});
}, function () {});
});
}
// calling getIpAddress many times causes a memory leak
(function loop() {
getIpAddress().then(loop);
})();
你知道getIpAddress
的哪一部分会导致内存泄漏吗?
如果您不知道,是否有其他方法可以在没有内存泄漏的情况下获取客户端的IP地址?
我已经尝试webrtc-ips但似乎webrtc-ips也会导致内存泄漏。
答案 0 :(得分:0)
我不确定循环WebRTC请求是“按设计”计划的。 只执行一次该功能时是否有内存泄漏? 通常,您只需要通过客户端捕获一次IP。
在我的Firefox中,没有内存泄漏,只有一个大的处理器充电,因为循环。
如果您可以使用PHP,那么获取IP地址将非常容易。
答案 1 :(得分:0)
你知道
getIpAddress
的哪一部分会导致内存泄漏吗?
似乎多次实例化RTCPeerConnection
会导致内存泄漏。
以下代码会导致内存泄漏,并可能导致Chrome 47和Firefox 43崩溃。
while (true) {
var RTCPeerConnection = window.RTCPeerConnection
|| window.mozRTCPeerConnection
|| window.webkitRTCPeerConnection;
var pc = new RTCPeerConnection({});
pc.close();
}