0

First of all, I'm using this piece of PHP code (a basic talkback server copied from https://www.php.net/manual/en/sockets.examples.php) to handle the websocket:

<?php
error_reporting(E_ALL);

/* Allow the script to hang around waiting for connections. */
set_time_limit(0);

/* Turn on implicit output flushing so we see what we're getting
* as it comes in. */
ob_implicit_flush();

$address = "127.0.0.1";
$port = 3547;

if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
    echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
}

if (socket_bind($sock, $address, $port) === false) {
    echo "socket_bind() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";
}

if (socket_listen($sock, 5) === false) {
    echo "socket_listen() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";
}

do {
    if (($msgsock = socket_accept($sock)) === false) {
        echo "socket_accept() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";
        break;
    }
    /* Send instructions. */
    $msg = "\nWelcome to the PHP Test Server. \n" .
        "To quit, type 'quit'. To shut down the server type 'shutdown'.\n";
    socket_write($msgsock, $msg, strlen($msg));

    do {
        if (false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) {
            echo "socket_read() failed: reason: " . socket_strerror(socket_last_error($msgsock)) . "\n";
            break 2;
        }
        if (!$buf = trim($buf)) {
            continue;
        }
        if ($buf == 'quit') {
            break;
        }
        if ($buf == 'shutdown') {
            socket_close($msgsock);
            break 2;
        }
        $talkback = "PHP: You said '$buf'.\n";
        socket_write($msgsock, $talkback, strlen($talkback));
        echo "$buf\n";
    } while (true);
    socket_close($msgsock);
} while (true);

socket_close($sock);

?>

And this piece of JavaScript code to handle the connecting to the websocket:

$(window).on("load", () => {

    let exampleSocket = new WebSocket("ws://127.0.0.1:3547");

    exampleSocket.onopen = (e) => {
        console.log("connected!");
        exampleSocket.send("first");
        setTimeout(() => {
            exampleSocket.send("second");
        }, 2000);
        setTimeout(() => {
            exampleSocket.send("third");
        }, 4000);
        setTimeout(() => {
            exampleSocket.send("fourth");
        }, 6000);
    };

    exampleSocket.onmessage = (e) => {
        console.log("from server: " + event.data);
    };

});

After running that PHP script in my local command line to get the websocket open and refreshing the webpage that is pulling that script, I get this JavaScript error within my console in my browser: WebSocket connection to 'ws://127.0.0.1:3547/' failed: Error during WebSocket handshake: net::ERR_INVALID_HTTP_RESPONSE and this PHP error in my command line window: socket_read(): unable to read from socket [10053]: An established connection was aborted by the software in your host machine..

I've already done a little bit of research on this issue but I've found no posts that specifically mentioned that the server was running on a local Apache server (which I'm not sure if that's causing the issue or not).

Any ideas?

Jacob
  • 439
  • 6
  • 19
  • 1
    you've created a simple TCP socket, but the websocket protocol has a bit more to it than that (e.g. the initial handshake is actually a HTTP request, for example). There's a list of reference implementations for PHP here: https://stackoverflow.com/questions/12203443/is-native-php-support-for-web-sockets-available, or you might be able to find newer ones with a quick google search. – ADyson May 24 '20 at 08:22
  • It might also be worth reading this guide to writing websocket servers: https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers and maybe the official standard: https://tools.ietf.org/html/rfc6455 to help you understand what you need to implement. Or, if you just want something that already works, you'd be better to use one of the existing libraries directly. – ADyson May 24 '20 at 08:24
  • Are you running any antivirus/firewall software that monitors ports? – Vinay May 24 '20 at 14:54
  • @Viney how would that be relevant? The two errors together clearly demonstrate that the browser terminated the connection because it didn't receive the expected response data from the server to create the HTTP handshake. The fact that both client and server generates error shows that a connection between them was initially made before being aborted, therefore there can't have been any blocking by firewalls etc. The reason for the errors is as I've already described in my first comment - the PHP code does not implement a compliant websocket server. – ADyson May 24 '20 at 17:49
  • Ops missed that `ERR_INVALID_HTTP_RESPONSE` part. I get it now – Vinay May 24 '20 at 18:01
  • 1
    Good suggestion @ADyson! I'll look into it. I guess I skimmed over the documentation for `socket_create()` a little too quickly and didn't consider it could be creating a TCP socket instead of a websocket. – Jacob May 24 '20 at 18:28
  • Well websockets do use basic TCP sockets underneath, it's just that the protocol is more complicated in terms of precisely how the server must respond – ADyson May 24 '20 at 18:34

0 Answers0