quinestor
quinestor

Reputation: 1442

Socket_read returning '1' ..?

I have recently started practicing with sockets on PHP and got an issue for which I find no documentation. Similar cases I've seen in C++, but not a clear answer to this. The code:

do {
    $input = socket_read($client, 12,PHP_BINARY_READ);
    echo $input;
} while(TRUE);

Is supposed to block on the socket (code for creation, bind, etc not included) and get either 12 bytes or whatever information is available from the other side.

Oddly I just get a '1' in the variable $input if 12 bytes are read. If I send from the client side more than 12 bytes then I receive '1[REST_OF_DATA]' in the value of $input.

Any idea why this is happening?

If I change this to more data and to PHP_NORMAL_READ then I correctly receive the data.

PHP manual online does not say anything abou socket_read returning '1'..

**EDIT: Ok thanks for yout early answers :). I am saving to a file and reading (not echoing to browser) expecting any character. I think I may have just discovered something that could be good if someone with knowledge of C++ sockets can verify. Anyways, my read code actually was this (not what I posted above):

do {
    $input = ($seq_id == 0) ? socket_read($client, 12,PHP_BINARY_READ) : socket_read($client,1024,PHP_BINARY_READ);
    echo $input;
} while(TRUE);

I was expecting 12 bytes at the first read, then chunks of 1024, reason for that condition check. The weird '1' comes from this. If I replace that with the line I posted above the data is read normally. In fact, even reading like this:

$input = ($seq_ID == 0) ? socket_read($client,12,PHP_BINARY_READ) : socket_read($client, 12,PHP_BINARY_READ);

Results in : 1st read = '1' 2nd read = correct data, 3rd read = correct data..

Upvotes: 2

Views: 862

Answers (2)

quinestor
quinestor

Reputation: 1442

For the comments above, yes $seq_id should increment. I just wanted to shorten the code. So now, the answer is not important for me anymore but remains an enigma, after upgrading my Ubuntu version this month I have been unable to replicate the error with the same script:

<?php
set_time_limit(0);
$address = "192.168.1.1";
$port = 3320;
$server_users = 3; 
$mysock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("Could not create socket\n");
$bind_result = socket_bind($mysock,$address, $port) or die("Could not bind to address\n"); 
$listen_result = socket_listen($mysock, $server_users)  or die("Could not set up socket   listener\n");
$client = socket_accept($mysock) or die("Could not accept the connection to socket\n");

$seq_id =0;
do {
$input = ($seq_id == 0) ? socket_read($client, 12,PHP_BINARY_READ) : socket_read($client,1024,PHP_BINARY_READ);
echo $input;
} while(TRUE);
?>

I execute it in terminal:

$php -q myscript.php

And test it using netcat:

$netcat 192.168.1.1 3320

Note that the question is about socket_read returning 1 as it results, which is not documented anywhere

Upvotes: 0

hakre
hakre

Reputation: 197659

The 12 you specify is the maximum length to read, so 12 can mean a return string of a size from 0-12 characters (binary string in PHP, 1 char = 1 byte).

Additionally as that can be binary, I suggest you use var_dump and a hexdump of the return string value to actually find out how many bytes were returned, echo might hide some control characters, your browser might hide whitespace.

Upvotes: 1

Related Questions