Задать вопрос
@KvoLt

Как получить данные, передаваемые на TCP порт с помощью PHP?

Телефонная станция передает данные CDR на заранее определенный IP по заранее определенному порту.
Задача: собирать эти данные и складывать в базу MySQL
Команда netcat -l -v 50000 > /home/it/log.txt отлично работает, пишет данные в файл.
Но с PHP ничего не получается.

<?php
error_reporting(E_ALL);
$service_port = 50000;
$address = '127.0.0.1';
/* Создать сокет TCP/IP. */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    echo "Не удалось выполнить функцию socket_create(): причина: " . socket_strerror(socket_last_error()) . "\n";
} else {
    echo "OK.\n";
}
echo "Попытка соединиться с хостом '$address' по порту '$service_port'...";
$result = socket_connect($socket, $address, $service_port);
if ($result === false) {
    echo "Не получилось выполнить функцию socket_connect().\nПричина: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";
} else {
    echo "OK.\n";
}
.................
?>

На этом этапе получаю ошибку PHP Warning: socket_connect(): unable to connect [111]: Connection refused in /home/it/test2.php
Есть идеи, как это побороть?
Вообще, в правильном направлении я думаю или нужно использовать что-то другое?
Спасибо!
  • Вопрос задан
  • 1297 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
@KvoLt Автор вопроса
to Александр @NeiroNx
Да, ту тему я видел, спасибо.
Но, насколько я понимаю, netcat как раз и слушает мой собственный порт, на который станция отправляет данные.
Аналогично я пытаюсь сделать и на PHP

UPDATE: отредактировано 21.07.2016 09:15:29
Вот конструкция, которая правильно получает данные с S8500
<?php
error_reporting(E_ALL);

$host = "0.0.0.0";
$port = 50000;
// No Timeout 
set_time_limit(0);

$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");
$result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n");
$result = socket_listen($socket, 3) or die("Could not set up socket listener\n");
$spawn = socket_accept($socket) or die("Could not accept incoming connection\n");

while ($result)
{
$input = socket_read($spawn, 94) or die("Could not read input\n");
echo  $input, "\n";
}

socket_close($spawn);
socket_close($socket);
?>


В станции прописана выдача данных CDR по 50000 порту
В ch sys cdr настроена выдача строки длиной 94 знака
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
NeiroNx
@NeiroNx
Программист
Тут вы пытаетесь подключиться сами к себе.
Похожий вопрос нашелся гуглом Прием потока данных через TCP сокет на PHP
Ответ написан
Комментировать
вам нужно использовать не socket_connect, а socket_listen (принимать соединения на указанном порту) + в цикле socket_accept (обработать каждое пришедшее соединение).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы