How to resolve Error: connect EISCONN ::1:5555 - Local (:ffff.127.0.0.1:5555)

82 views Asked by At

I am making an electron app and I need to listen to a tcp port on my local machine. When I start the application, I get : A JavaScript error occurred in the main process Uncaught Exception:

Error: connect EISCONN ::1:5555 - Local (:ffff.127.0.0.1:5555) at internalConnect (node:net 1067:16) at defaultTriggerAsyncldScope (node:internal/async_hooks:463:18) at GetAddrlnfoReqWrap.emitLookup [as callback] (node:netl 324:9) at GetAddrlnfoReqWrap.onlookup [as oncompletel (node:dns:110:8)

here is my code :

//Imports
const fs = require('fs');
const net = require('net');
const path = require('node:path');
const { app, ipcMain, BrowserWindow } = require('electron');

//general variables
let settings
let mainWindow
const isMac = process.platform === 'darwin';

//create the server
let server

//window cunstructor
const createWindow = () => {
    mainWindow = new BrowserWindow({
        title: 'Bitburner Dashboard',
        width: 800,
        height: 600,
        webPreferences: {
            nodeIntegration: true,
            contextIsolation: true,
            preload: path.join(__dirname, 'preload.js')
        }
    });

    mainWindow.loadFile('front/index.html');
}

//wait for window to start server
ipcMain.on('mainWindow-ready', () => {
    if (!fs.existsSync(path.join(__dirname, 'settings.json'))) {
        fs.writeFileSync(path.join(__dirname, 'settings.json'), JSON.stringify({
            port: 5555
        }), (error) => {
            if (error) {
                console.log(error)
            }
            throw error;
        })
    }

    try {
        // reading a JSON file synchronously
        settings = JSON.parse(fs.readFileSync("settings.json"));
        console.log(settings)
    } catch (error) {
        // logging the error
        console.error(error);
        throw error;
    }

    server = net.createServer(socket => {

        //connect on port
        socket.connect(settings.port);
        socket.setKeepAlive(true);
    
        //format data and send on recieve
        socket.on("data", data => {
            data = data.toString().split("\n")[17].split(",");
    
            data = {
                id: data[0],
                state: data[1],
                updated_at: data[2],
                hostname: data[3],
                admin: data[4],
                level: data[5],
                purchased: data[6],
                connected: data[7],
                backdoored: data[8],
                cores: data[9],
                ram: {
                    used: data[10],
                    max: data[11],
                    free: data[12],
                    trueMax: data[13]
                },
                power: data[14],
                organisation: data[15],
                isHome: data[16],
                ports: {
                    required: data[17],
                    open: data[18],
                    ftp: data[19],
                    http: data[20],
                    smtp: data[21],
                    sql: data[22],
                    ssh: data[23]
                },
                security: {
                    level: data[24],
                    min: data[25]
                },
                money: {
                    available: data[26],
                    max: data[27],
                    growth: data[28]
                }
            };
    
            mainWindow.webContents.send("data-recieved", data);
    
            socket.destroy();
        });
    });

    mainWindow.webContents.send("settings-init", settings);
    server.listen(settings.port)
});

ipcMain.on('setting-update', (e, settings) => {
    server.close()
    server = net.createServer(socket => {

        //connect on port
        socket.connect(settings.port);
        socket.setKeepAlive(true);
    
        //format data and send on recieve
        socket.on("data", data => {
            data = data.toString().split("\n")[17].split(",");
    
            data = {
                id: data[0],
                state: data[1],
                updated_at: data[2],
                hostname: data[3],
                admin: data[4],
                level: data[5],
                purchased: data[6],
                connected: data[7],
                backdoored: data[8],
                cores: data[9],
                ram: {
                    used: data[10],
                    max: data[11],
                    free: data[12],
                    trueMax: data[13]
                },
                power: data[14],
                organisation: data[15],
                isHome: data[16],
                ports: {
                    required: data[17],
                    open: data[18],
                    ftp: data[19],
                    http: data[20],
                    smtp: data[21],
                    sql: data[22],
                    ssh: data[23]
                },
                security: {
                    level: data[24],
                    min: data[25]
                },
                money: {
                    available: data[26],
                    max: data[27],
                    growth: data[28]
                }
            };
    
            mainWindow.webContents.send("data-recieved", data);
    
            socket.destroy();
        });
    });
    server.listen(settings.port)
    console.log(JSON.stringify(settings))
    fs.writeFileSync(path.join(__dirname, 'settings.json'), JSON.stringify(settings), (error) => {
        if (error) {
            console.log(error)
        }
        throw error;
    })
})

//start app
app.on('ready', () => {
    createWindow();

    app.on('activate', () => {
        if (BrowserWindow.getAllWindows().length === 0) createWindow();
    });
});

//close app
app.on('window-all-closed', () => {
    if (!isMac) app.quit();
})

app.on('close', () => {
    server.close()
});

I've tried to close the server on close but it wasn't the problem

1

There are 1 answers

0
CodeIsUnexecutable On

I figured out what was my problem: I was basically sending HTTP requests on a TCP server. I fixed it by changing my server code like this:

let server = net.createServer(conn => {
    conn.on('data', data => {
        conn.write(data + '\r\n');
        mainWindow.webContents.send("data-recieved", JSON.parse(data.toString().split('\n')[17]));
    });

    conn.on('end', () => {
    });
});

The complete code now looks like this:

/* --------------------------------- Imports -------------------------------- */
const fs = require('fs');
const net = require('net');
const path = require('node:path');
const { app, ipcMain, BrowserWindow } = require('electron');




/* -------------------------------- variables ------------------------------- */
let settings;
let mainWindow;
const isMac = process.platform === 'darwin';




/* --------------------------------- server --------------------------------- */
let server = net.createServer(conn => {

    conn.on('data', data => {
        conn.write(data + '\r\n');
    
            mainWindow.webContents.send("data-recieved", JSON.parse(data.toString().split('\n')[17]));
    });

    conn.on('end', () => {
    });
});

/* --------------------------- window constructor --------------------------- */
const createWindow = () => {
    mainWindow = new BrowserWindow({
        title: 'Bitburner Dashboard',
        width: 800,
        height: 600,
        webPreferences: {
            nodeIntegration: true,
            contextIsolation: true,
            preload: path.join(__dirname, 'preload.js')
        }
    });

    mainWindow.loadFile('front/index.html');
}


/* ----------------------------------- IPC ---------------------------------- */
//wait for window to start server
ipcMain.on('mainWindow-ready', () => {
    //open settings
    openSettings();

    mainWindow.webContents.send("settings-init", settings);
    server.listen(settings.port)
});

ipcMain.on('setting-update', (e, settings) => {

    //close the server and start on the good port
    server.close()
    server.listen(settings.port)

    //save the settings
    fs.writeFileSync(path.join(__dirname, 'settings.json'), JSON.stringify(settings), (error) => {
        if (error) {
            console.log(error)
        }
        throw error;
    })
})


/* -------------------------------- Funcntions ------------------------------- */
//open the setting file or create one
function openSettings() {

    //Check if the file exists
    if (!fs.existsSync(path.join(__dirname, 'settings.json'))) {

        //creates the file if it does not exist
        fs.writeFileSync(path.join(__dirname, 'settings.json'), JSON.stringify({
            port: 5000
        }), (error) => {
            if (error) {
                console.error(error);
            }
            throw error;
        });

        settings = {
            port: 5000
        };
    } else {

        //Opens the file
        try {
            // reading a JSON file synchronously
            settings = JSON.parse(fs.readFileSync("settings.json"));
        } catch (error) {
            if (error) {
                console.error(error);
            }
            throw error;
        }
    }
}




/* ------------------------------- app routes ------------------------------- */
//start app
app.on('ready', () => {
    createWindow();

    //kill server when closing window
    mainWindow.on('close', () => {
        server.close();
    })

    app.on('activate', () => {
        if (BrowserWindow.getAllWindows().length === 0) createWindow();
    });
});

//make sure server is close on close
app.on('close', () => {
    server.close();
});

//close app
app.on('window-all-closed', () => {
    if (!isMac) app.quit();
})