Это правильный способ подключения к TCP-порту с помощью PHP?

Служба прослушивает порт 1234 на 1xx.xxx.xx.xx. Я использую php fsockopen() для установки TCP-соединения со службой! Я должен отправить входящие данные в службу и сохранить ответ, полученный от службы, в файле. В первый раз, когда я отправляю данные, соединение устанавливается. Второй раз код снова пытается открыть порт и на этот раз служба говорит, SP пытается подключиться. В соединении отказано. Существует активное соединение SP. СП закрыто.

Как мне преодолеть эту проблему?

#!/usr/local/php5/bin/php-cgi
<?php 
//The Client
error_reporting(E_ALL);
$CONTENT = $_GET["DATA"]."";
echo urldecode($CONTENT);
$Handle = fopen("/xxx/xxx/xxx.txt", "a");
fwrite($Handle, $CONTENT);
fclose($Handle);

//$address = "1xx.xxx.xx.xx";
//$port = 1234;

/* Create a TCP/IP socket. */
$fp = fsockopen("tcp://1xx.xxx.xx.xx",1234 , $errno, $errdesc); 
if ( ! $fp ) {
  die ( "Couldn't connect to 1xx.xxx.xx.xx :\nError: $errno\nDesc: $errdesc\n" );
}
fputs ( $fp, $CONTENT );
while ( ! feof( $fp ) ) {
  $output = fgets( $fp, 2048 );
}
fclose( $fp );
$Handle1 = fopen("/xxx/xxx/yyy.txt", "a");
fwrite($Handle1, $output);
fclose($Handle1);

?>

person emil    schedule 08.08.2011    source источник
comment
Я предполагаю, что это не проблема с подключением к сокету, а скорее некоторая особенность службы (если я правильно понимаю, сообщение об ошибке находится в $ output, а не в $ errdesc). Возможно, вам придется закрыть сессию какой-то командой quit или exit после вашего запроса к сервису. Если этого не существует, нам может потребоваться дополнительная информация об услуге.   -  person vstm    schedule 08.08.2011


Ответы (1)


Еще одно замечание: вам нужно заменить

while ( ! feof( $fp ) ) {
  $output = fgets( $fp, 2048 );
}

с

$output=''
while ( ! feof( $fp ) ) {
  $output .= fgets( $fp, 2048 );
}

Потому что $output = fgets( $fp, 2048 ); перезаписывает содержимое $output в каждом цикле итераций.

Что касается вашего вопроса - я думаю, что в сервисе какая-то ошибка.

person seriyPS    schedule 08.08.2011