zhangrui.i
zhangrui.i
发布于 2024-05-30 / 1 阅读
0
0

纯前端获取网关ip

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
</head>

<body>
    <h1>网关IP: <span id="ip"></span></h1>
    <script>
        function getIPs(callback) {
        var ip_dups = {}
        var RTCPeerConnection =
          window.RTCPeerConnection ||
          window.mozRTCPeerConnection ||
          window.webkitRTCPeerConnection
        var useWebKit = !!window.webkitRTCPeerConnection
        var mediaConstraints = {
          optional: [{ RtpDataChannels: true }],
        }
        // 这里就是需要的ICEServer了
        var servers = {
          iceServers: [
            { urls: 'stun:stun.services.mozilla.com' },
            { urls: 'stun:stun.l.google.com:19302' },
          ],
        }
        var pc = new RTCPeerConnection(servers, mediaConstraints)
        function handleCandidate(candidate) {
          var ip_regex =
            /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/
          var hasIp = ip_regex.exec(candidate)
          if (hasIp) {
            var ip_addr = ip_regex.exec(candidate)[1]
            if (ip_dups[ip_addr] === undefined) callback(ip_addr)
            ip_dups[ip_addr] = true
          }
        }
        // 网络协商的过程
        pc.onicecandidate = function (ice) {
          if (ice.candidate) {
            handleCandidate(ice.candidate.candidate)
          }
        }
        pc.createDataChannel('')
        //创建一个SDP(session description protocol)会话描述协议 是一个纯文本信息 包含了媒体和网络协商的信息
        pc.createOffer(
          function (result) {
            pc.setLocalDescription(
              result,
              function () {},
              function () {}
            )
          },
          function () {}
        )
        setTimeout(function () {
          var lines = pc.localDescription.sdp.split('\n')
          lines.forEach(function (line) {
            if (line.indexOf('a=candidate:') === 0) handleCandidate(line)
          })
        }, 1000)


      }
      getIPs(function (ip) {
        console.log(ip)
        document.getElementById('ip').innerHTML = ip
      })
    </script>
</body>

</html>


评论