#1 2017-03-21 23:15:31

mh4fancz
Endora uživatel
Registrován: 1970-01-01
Příspěvky: 2

PHP script - obecná komunikace přes TCP sockety

Dobrý den,
předně chci předeslat, že jsem v PHP nováček, čili mé výrazové prostředky nebudou přesné.
Mým záměrem bylo vytvořit PHP script, který vytvoří TCP socket čekající na připojení z jakékoliv IP adresy na specifickém portu.
K tomuto socketu se připojí na daném portu klient a poté proběhne výměna dat na tomto socketu podle valstního protokolu.
Jedná se pouze o ověření funkčnosti výměny dat na úrovni TCP socketu s klientským GSM modemem připojeným přes GPRS do internetu.

Je možné zde na Endora takovouto komunikaci na úrovni TCP socketu provozovat, či je to ze strany Endora nějak omezeno např. na specifické porty atd.

Pro začátek jsem použil příklad z internetu, ale nedaří se mi ze strany klienta na poslouchající TCP socket připojit:

<?php
echo ("***** TCPSERVER *********** <br />");

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 = '0.0.0.0';	/*Wait for connection from any IP address*/
$port = 10000;		/*and on specific incomming port*/

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);

?>

Netuším, kde přesně hledat chybu, ale napadlo mě, jestli není tato komunikace nějak na úrovni Endora zakázána.
Zkoušel jsem také socket_bind() použit i na specifickou příchozí IP adresu připojujícího se klienta, ale také se generuje chyba:
[21-Mar-2017 18:36:17 Europe/Prague] PHP Warning:  socket_bind(): unable to bind address [99]: Cannot assign requested address in /home/users/mh4fancz/mh.4fan.cz/web/TcpServer/tcpserver.php on line 25

Ale také jsem viděl chybu až na následujícím řádku se socket_listen().

Má někdo podobnou zkušenost a je tento způsob komunikace na úrovni TCP socketů na Endora hostingu(mám zřízený ten nejzákladnější účet) vůbec možný?

Děkuji za odpověď.

Offline

#2 2017-03-22 07:13:15

JF
Endora rádce
Místo: Plzeň
Registrován: 2010-06-22
Příspěvky: 9,744
Web

Re: PHP script - obecná komunikace přes TCP sockety

S php skriptami na hostingu Endora môžete komunikovať len cez port 80, prípadne 443 ak máte program PLUS alebo MEGA.


Ján Fačkovec - Helpdesk Endora.cz
- Email: jan.fackovec(zavináč)endora.cz
- Web: www.endora.cz
Zlepšite si stránku českým validátorom!

Offline

#3 2017-03-22 22:54:00

mh4fancz
Endora uživatel
Registrován: 1970-01-01
Příspěvky: 2

Re: PHP script - obecná komunikace přes TCP sockety

Děkuji za odpověď.

Pokud je tedy možné komunikovat pouze přes port 80, lze otevřít naslouchající(serverový) socket na portu 80 následujícím způsobem?:

.......
$address = "0.0.0.0";	/*From everywhere*/
$port = 80;			/*Connect on incomming port*/

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 something. */
    /* 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));
......

Zkoušel jsem to a výsledkem je stejná chyba:

[22-Mar-2017 21:24:17 Europe/Prague] PHP Warning:  socket_bind(): unable to bind address [13]: Permission denied in /home/users/mh4fancz/mh.4fan.cz/web/TcpServer/tcpserver.php on line 28

Je to tak, že port 80 je totiž použit pro příchozí socket

socket_bind($sock_xy, "0.0.0.0", 80)

již na systémové úrovni Endora a čeká na příchozí http spojení na mém zřízeném Endora profilu?
Tudiž otevření socketu(byť na povoleném portu 80) v uživatelském PHP scriptu proto stejně není možný?

Omlouvám se, že se ptám takto asi laicky na možná jasné věcí, ale opravdu mám s tímto tématem malé zkušenosti.

Offline

#4 2017-03-27 09:40:21

PetrAndel
Podpora
Registrován: 2015-07-27
Příspěvky: 480

Re: PHP script - obecná komunikace přes TCP sockety

Dobrý den,

přesně tak, socket takto přímo není možné na Endoře otevřít, je mi líto.

Offline

Zápatí

Založeno na FluxBB | CZ a SK