reactphp / socket

Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP.

Home Page:https://reactphp.org/socket/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Write never send data

mastir opened this issue · comments

When i test my server, i see new connection, but no data sent.

$minimal = hex2bin('78780d0103587350716231840064b1450d0a').hex2bin('78780a1305060400020067e3370d0a').hex2bin('78781f12120612102129c60533baf803bf642414544b00ff0675330005e9001941d00d0a');

$loop = React\EventLoop\Factory::create();
$connector = new React\Socket\Connector($loop);
$port = $argv[1] ?? 33664;
$connector->connect('127.0.0.1:'.$port)->then(function ($conn) use ($loop) {
    $conn->on('data', function($chunk){
        echo '.';
    });
    $conn->on('error', function(){
        echo 'error';
    });
    $conn->on('close', function(){
        echo 'close';
    });
    echo 'Send'.PHP_EOL;
    $conn->send($minimal);
    $conn->end();

});

$loop->run();
echo 'done?'.PHP_EOL;

iptables -L

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination 

I started nc -l 0.0.0.0 33664 and nothing. I see "Send" message, but nothing ever happens. Only if i stop nc i see "close" message. But when i send a big amount of data it works. Tried piping 2mb file with test data and it worked so I tried to save into file this data and pipe it - nothig comes.

Tried without react and everything works

$port = $argv[1] ?? 33664;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$result = socket_connect($socket, '127.0.0.1', $port);
echo 'Connect: '.($result ? 'OK' : 'FAIL');
if (!$result)exit;

$minimal = hex2bin('78780d0103587350716231840064b1450d0a').hex2bin('78780a1305060400020067e3370d0a').hex2bin('78781f12120612102129c60533baf803bf642414544b00ff0675330005e9001941d00d0a');

echo 'Got:';
socket_write($socket, $minimal, strlen($minimal));
while ($data = socket_read($socket, 2048)) {
    echo chunk_split(bin2hex($data),2,' ');
}
echo "close..\n\n";
socket_close($socket);

Connect: OKGot:78 78 05 01 00 64 ed 77 0d 0a 78 78 05 13 00 67 ef c1 0d 0a

@mastir Thanks for reporting, this is a nasty one!

It looks like there's s small oversight and all you're missing is a use ($minimal) in your code. Because this is missing, you're essentially passing an undefined variable to $conn->send() which PHP will report (as a warning in PHP 8+ and as a notice in earlier versions) and continue with a null value, effectively sending nothing.

Your IDE of choice or static analysis tools such as phpstan should be able to point you to this variable. On top of this, you can configure PHP to show this warning/notice to you during runtime.

If you're using an error handler that turns this warning/notice into an Exception or Throwable, the code will currently cause the promise to be rejected on this line. We're working on reactphp/promise#87 to improve default error reporting in this case.

I believe this has been answered, so I'm closing this for now. Please come back with more details if this problem persists and we can always reopen this 👍