magicink Posted September 24, 2008 Share Posted September 24, 2008 Hello, I created a class that I use to open socket connections. I can connect to a target just fine and I can retrieve data. The real problem is that I don't seem to be able to acquire all the data when the response is longer than 600 or so characters long. 600 is a rough estimate because due to the fact that when I reload the page, sometimes I can acquire more data, sometimes I acquire less ~3 characters. I figured the variant meant that there was an issue with the script timing out before all the data was acquired, but even if I set stream_set_timeout () to 10 minutes, it doesn't change the result. Here is the class: <?php /** * SocketConnection manages a connection that is based upon the PHP * fopensock function. This code is based off of code originally * writen by Antone Roundy. * * @author * @version 1.1 */ class SocketConnection extends Connection { private $connectionAddress; private $port; /** * Constructs a new socket connection. */ public function SocketConnection ( $connectionAddress, $port ) { parent::__construct (); $this->connectionAddress = $connectionAddress; $this->port = $port; } /** * This methods attempts to make a connection to the socket. */ public function connect () { $connectionErrors = parent::getConnectionErrors (); // If the wrong version of PHP is running... if ( ! PHPUtility::isValidPHPVersion ( '5.0.0' ) ) { // Add version error. $connectionErrors->addError ( new PHPVersionError () ); } // If no connection address has been provided... if ( ! strlen ( $this->connectionAddress ) ) { // Add null connection address error. $connectionErrors->addError ( new NullConnectionAddressError () ); } // If there are no errors... if ( $connectionErrors->getTotalErrors () == 0 ) { // Attempt to establish a connection. $connectionHandler = @fsockopen ( $this->connectionAddress, $this->port, $errorNumber, $errorString ); // If a connection has been established... if ( $connectionHandler ) { // Store the connection. parent::setConnection ( $connectionHandler ); stream_set_timeout ( parent::getConnection (), 0 ); } // If a connection has not been established... else { // Add the error generated by the system. parent::getConnectionErrors ()->addError ( new ConnectionError ( $errorString ) ); } } } /** * This methods attempts to severe the connection. */ public function disconnect () { $connection = parent::getConnection (); // If a connection exist... if ( $connection ) { // Kill the connection. fclose ( $connection ); parent::setConnection ( null ); } } /** * This method reads the socket stream buffer for any unread * data and grabs it. */ public function getResponse () { $connection = parent::getConnection (); // Make sure that a connection exist if ( $connection ) { parent::clearBuffer (); $response = ''; // Cycle through the connection data atleast once. do { $response .= fread ( $connection, 8192 ); $socketStatus = socket_get_status ( $connection ); } while ( $socketStatus [ 'unread_bytes' ] ); $response = trim ( preg_replace( "/^.*?\n(.*)\n[^\n]*$/", "$1", $response ) ); parent::setBuffer ( $response ); } } /** * This method sends a command to the connection and records the response * in the buffer. */ public function sendCommand ( $command ) { $connection = parent::getConnection (); if ( $connection ) { fputs ( $connection, $command . "\r" ); sleep ( 1 ); $this->getResponse (); } } } ?> The method responsible for acquiring data is SocketConnection::getResponse (). The following is what I get when I create a SocketConnection and connect to a system. getcc <CalibrationCoefficients DeviceType = 'SBE37SI-RS232' SerialNumber = '03706087'> <Calibration format = 'TEMP1' id = 'Temperature'> <SerialNum>03706087</SerialNum> <CalDate>04-Aug-08</CalDate> <A0>7.668374e-05</A0> <A1>2.643877e-04</A1> <A2>-1.718200e-06</A2> <A3>1.318193e-07</A3> </Calibration> <Calibration format = 'WBCOND0' id = 'Conductivity'> <SerialNum>03706087</SerialNum> <CalDate>04-Aug-08 </CalDate> <G>-9.758729e-01</G> <H>1.390257e-01</H> <I>-2.276137e-04</I> <J>3.585628e-05</J> <P The following is what I suppose to have: <CalibrationCoefficients DeviceType = 'SBE37SI-RS232' SerialNumber = '03706087'> <Calibration format = 'TEMP1' id = 'Temperature'> <SerialNum>03706087</SerialNum> <CalDate>04-Aug-08</CalDate> <A0>7.668374e-05</A0> <A1>2.643877e-04</A1> <A2>-1.718200e-06</A2> <A3>1.318193e-07</A3> </Calibration> <Calibration format = 'WBCOND0' id = 'Conductivity'> <SerialNum>03706087</SerialNum> <CalDate>04-Aug-08 </CalDate> <G>-9.758729e-01</G> <H>1.390257e-01</H> <I>-2.276137e-04</I> <J>3.585628e-05</J> <PCOR>-9.570000e-08</PCOR> <TCOR>3.250000e-06</TCOR> <WBOTC>2.512962e-07</WBOTC> <REFERENCE_PRESSURE>0.000000e+00</REFERENCE_PRESSURE> </Calibration> </CalibrationCoefficients> Does anyone have any ideas as to why my content is being cut off? Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.