0

This is for a bigger project but i managed to condense it into one small program.

I am trying to get the ip address of the client from a websocket connection. I found out that I can use socket.handshake.address but when I run it on repl.it it always says the ip address is 172.18.0.1 no madder where I am connected from.

Index.js

const express = require('express');


const http = require('http').createServer();
const app = require('express')();
const server = require('http').createServer(app);
const io = require('socket.io')(server);
io.on('connection', () => { /* … */ });
server.listen(3000);


app.get('/', (request, response) => {
    response.sendFile('/home/runner/basicSocketio/index.html');

    });


io.on('connection', (socket) => {
  io.emit("message", "hello client")

    socket.on('message', (message) => {
    console.log(socket.handshake.address)//always prints ::ffff:172.18.0.1
  })
})

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-9">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <script src = "https://cdn.socket.io/socket.io-3.0.0.js"></script>

</head>
<body>
test
</body>
</html>

<script>


const socket = io();
socket.emit('message', "hi server");
socket.on('message', text => {
    console.log("recieved: " + text);
    

});

</script>

I am not sure why this is happening and cant find any solutions, when i ran this locally it seemed to work fine. What can i do to fix it?

jfriend00
  • 683,504
  • 96
  • 985
  • 979

1 Answers1

0

172.18.0.1 is repl.it's HTML server internal address since they serve you the index.html and it's there where you make the call to const socket = io().

To see the client's real ip use socket.handshake.headers['x-forwarded-for'] expression as in:

  

  io.on('connection', (socket) => {
      io.emit('message', 'hello client')
      socket.on('message', (text) => {
        console.log(text)
        // console.log(socket.handshake.address) // Server serving index.html file IP address
    })

      console.log('a client connected')
      console.log('client IP addr: ' + socket.handshake.headers['x-forwarded-for']) // (REAL) client IP
    })
dan m.
  • 16
  • 1
  • 3
  • Thank you so much! On a side note, i noticed that it now gives an ip address that does not change for devices on the same network. I was wondering if there was any way to get a ip address that does change or just what I should use to identify users from a websocket if they are on the same network? – MagicBBanana Jan 18 '22 at 05:26
  • This is just how IPv4 works ― two computers on the internet only SEE each other up until the last public IPv4 hop, which is usually your gateway / router. From there on, the router maintains a translation table (NAT) for the last part of the route. Goes something like this (Google IP (8.8.8.8) ⇾ your router public IP (x.x.x.x) ⇾ your computer private IP (typically 192.168.x.x)). Until we have greater IPv6 adoption (where each device can have a public IP) there isn't any way of identifying clients like that __over the internet__. You could have a server local to your network though :) – dan m. Jan 18 '22 at 13:34