php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #14806 server RECV strange if using PHP clients
Submitted: 2002-01-02 13:03 UTC Modified: 2002-07-01 15:55 UTC
From: wolfgang dot sprick at tlc dot de Assigned:
Status: Not a bug Package: Sockets related
PHP Version: 4.1.0 OS: W2K
Private report: No CVE-ID: None
 [2002-01-02 13:03 UTC] wolfgang dot sprick at tlc dot de
we've got a serious problem that we couldn't fix within a week even after trying several options. So we very much appreciate ANY help.

We use PHP 4.1.0 on Windows 2000 server under IIS.

Situation: we are running socket-based servers that follow the implementation recommendations found at http://tangentsoft.net/wskfaq/. The problems encountered can be reproduced by using the "BasisServer" provided at http://tangentsoft.net/wskfaq/examples/basics/basic-client.html.

Test1.

We use the fokkowing PHP-Script. Thereby we use the native socket-functions introduced in PHP 4.1.0.

<?
 
 $port = 2222;
 $string = "P RegioTicket/Haltestellensuche@R 0@N Frankfurt@A 15@";
 
 $socket = socket_create (AF_INET, SOCK_STREAM, 0); 
 if ($socket < 0) 
 {
    echo "socket_create() failed: reason: ";
 } 
 else 
 {
    "socket_create() successful: ";
 }
 $ip = gethostbyname ('172.24.79.232'); 
 echo "&nbsp;Attempting to connect to '$ip' on port '$port'...";
 $result = socket_connect ($socket, $ip, $port);
 if ($result < 0) 
 {
    echo "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n";
 } 
 else 
 {
    echo "   OK.\n";	
 }
 $length =  strlen($string);
 
 echo "<br>Variable $" . $string . "$<BR>";
  
 $retcodew = socket_write ($socket, $string, $length);  
 $retcoder = socket_read ($socket, $var, 10);
  
echo "<br>Variable $" . $var . "$<BR>";
echo "return Code Write :" . $retcodew . "<br>";
echo "Return Code Read :" . $retcoder ;

?>

To follow the example debug the BasicServer.exe  (basic-server.cpp) or just believe me <g>.

The server waits within ACCEPT. When the client sends data it RECEIVES this data and SENDS it back as an echo. It cycles throught the rest of the loop, ending in another RECEIVE. This RECEIVE returns "-1", which is recognized as an socket error, finally leading into closing down the server. Unwanted result.

Test2.

We use the following PHP-script. Thereby we use the classic style with fsockopen, fputs, fgets, fsockclose.

<?php
        $anfrage = "P RegioTicket/Haltestellensuche@";
        $anfrage .= "R 0@";
        $anfrage .= "N Frankfurt@";
        $anfrage .= "A 15@";	
  echo "$anfrage <br>";
  
  $fp = fsockopen("172.24.79.232", 2222, &$errno, &$errstr, 10);
        if(!$fp)
        {
            $err = "error: $errstr ($errno)<br>";
            return $err;
        }
        else
        {
            $n = strlen($anfrage); // size of buffer for request
            //$str = sprintf("%08d%s", $n, $anfrage);
            fputs($fp, $anfrage);
						
			echo "test nach puts()";
            $result = fgets($fp, 128);
            //get_selection($fp, $select);
            //socket_shutdown($fp, 1);
            fclose($fp);
            return $result;
        }          
?>

The server waits within ACCEPT. When the client sends data it RECEIVES this data and SENDS it back as an echo. It cycles throught the rest of the loop, ending in another RECEIVE. This RECEIVE waits indefinitely until some timeout occurs. Unwanted result, the server is blocked.

Test3.

We use one of our good old REXX scripts and rxsock.dll.

The server waits within ACCEPT. When the client sends data it RECEIVES this data and SENDS it back as an echo. It cycles throught the rest of the loop, ending in another RECEIVE. This RECEIVE returns "0" which indicates that no more data is available, the server closes the connection, recycles itself into the ACCEPT statement again and waits for the next connection request. We consider this to be the expected result, being comaptible to our own C++-clients and the examples we found in the Internet.

So our question is, why the results are different when using PHP. Maybe we just need to know how to inplement that in a better way using PHP. But as we already spent some considerable time with it, we think, that the inplementation within PHP (both) might need some improvement. But maybe PHP just needs server that follow some rules of a protocol. If so, where can we find specifications  for this?

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2002-07-01 15:55 UTC] jason@php.net
Not enough information was provided for us to be able
to handle this bug. Please re-read the instructions at
http://bugs.php.net/how-to-report.php

If you can provide more information, feel free to add it
to this bug and change the status back to "Open".

Thank you for your interest in PHP.


I breifly looked at basic-server.cpp and there are some problems, as it is written as just an example. We need the smallest possible script that highlights the problem (to the function that produces the problem if possible). You may want 
to try posting a bug report demonstrating the problem using 
a known good server, like connecting to a webserver.


 
PHP Copyright © 2001-2020 The PHP Group
All rights reserved.
Last updated: Mon Sep 28 09:01:25 2020 UTC