获取客户端IP地址的功能会导致内存泄漏

时间:2015-12-20 11:12:12

标签: javascript memory-leaks webrtc

我正在创建一个应用程序,在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也会导致内存泄漏。

2 个答案:

答案 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();
}