What is equivalent php fgetc () for Node.js socket?

What is the Node.js equivalent of fgetc () function in php? And how would you apply it to a socket?

I am working on the Node.js port of this PHP script: http://code.google.com/p/bf2php/source/browse/trunk/rcon/BF2RConBase.class.php

It mainly uses sockets to connect to Battlefield 2 game servers. The function I'm looking for is:

protected function read($bare = false) {
    $delim = $bare ? "\n" : "\x04";
    for($buffer = ''; ($char = fgetc($this->socket)) != $delim; $buffer .= $char);
    return trim($buffer);
}

It is supposed to capture the first line directly from the socket (from what I am collecting) one character at a time, while "\ n". I assume the output is used to capture the encryption salt. The function is called in the connect event of the socket as part of the code that generates the encrypted password required to enter the system. Can someone show me what the Node.js equivalent of this function might look like?

+3
source share
1 answer

docs have a great example of how to connect to a server over a network.

var net = require('net');
var client = net.connect({port: 8124},
    function() { //'connect' listener
  console.log('client connected');
  client.write('world!\r\n');
});
client.on('data', function(data) {
  console.log(data.toString());
  client.end();
});
client.on('end', function() {
  console.log('client disconnected');
});

Just change the event handler datato buffer incoming data until you get the information you need.

To do this, you will want to learn how to use it Buffer.


Here is a concrete example of how to buffer data from a stream and parse messages limited to a specific character. I noticed in related PHP that the protocol you are trying to implement divides messages with the EOT character (0x04).

var net = require('net');


var max = 1024 * 1024 // 1 MB, the maximum amount of data that we will buffer (prevent a bad server from crashing us by filling up RAM)
    , allocate = 4096; // how much memory to allocate at once, 4 kB (there no point in wasting 1 MB of RAM to buffer a few bytes)
    , buffer=new Buffer(allocate) // create a new buffer that allocates 4 kB to start
    , nread=0 // how many bytes we've buffered so far
    , nproc=0 // how many bytes in the buffer we've processed (to avoid looping over the entire buffer every time data is received)
    , client = net.connect({host:'example.com', port: 8124}); // connect to the server

client.on('data', function(chunk) {
    if (nread + chunk.length > buffer.length) { // if the buffer is too small to hold the data
        var need = Math.min(chunk.length, allocate); // allocate at least 4kB
        if (nread + need > max) throw new Error('Buffer overflow'); // uh-oh, we're all full - TODO you'll want to handle this more gracefully

        var newbuf = new Buffer(buffer.length + need); // because Buffers can't be resized, we must allocate a new one
        buffer.copy(newbuf); // and copy the old one data to the new one
        buffer = newbuf; // the old, small buffer will be garbage collected
    }

    chunk.copy(buffer, nread); // copy the received chunk of data into the buffer
    nread += chunk.length; // add this chunk length to the total number of bytes buffered

    pump(); // look at the buffer to see if we've received enough data to act
});

client.on('end', function() {
    // handle disconnect
});


client.on('error', function(err) {
    // handle errors
});


function find(byte) { // look for a specific byte in the buffer
    for (var i = nproc; i < nread; i++) { // look through the buffer, starting from where we left off last time
        if (buffer.readUInt8(i, true) == byte) { // we've found one
            return i;
        }
    }
}
function slice(bytes) { // discard bytes from the beginning of a buffer
    buffer = buffer.slice(bytes); // slice off the bytes
    nread -= bytes; // note that we've removed bytes
    nproc = 0; // and reset the processed bytes counter
}

function pump() {
    var pos; // position of a EOT character

    while ((pos = find(0x04)) >= 0) { // keep going while there a EOT (0x04) somewhere in the buffer
        if (pos == 0) { // if there more than one EOT in a row, the buffer will now start with a EOT
            slice(1); // discard it
            continue; // so that the next iteration will start with data
        }
        process(buffer.slice(0,pos)); // hand off the message
        slice(pos+1); // and slice the processed data off the buffer
    }
}

function process(msg) { // here where we do something with a message
    if (msg.length > 0) { // ignore empty messages
        // here where you have to decide what to do with the data you've received
        // experiment with the protocol
    }
}

, . , , , . , .

+1

Source: https://habr.com/ru/post/1692799/


All Articles