Идея состоит в том, чтобы связать веб-страницу PHP и программу C через TCP-сокет, чтобы эта веб-страница ожидала соединения с программой C и получала данные сразу же после установления соединения. Код связи РНР сокета и приема данных ниже:PHP, получающий данные из сокета TCP повторно
РНР (socketRead.php):
$address = 'localhost';
$port = 5001;
if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
echo "Socket creation error";
}
else {
echo "Socket created <br/>";
}
if (($ret = socket_bind($sock, $address, $port)) < 0) {
echo "Host/port connection failed";
}
else {
echo "Host/port connection successful <br/>";
}
if (($ret = socket_listen($sock, 5)) < 0) {
echo "Socket error";
}
else {
echo "Waiting connection <br/>";
}
if (($msgsock = socket_accept($sock)) < 0) {
echo "Socket connection start error";
} else {
echo "Awaiting data <br/>";
}
//Connection established, reading data
if (false === ($buf = socket_read($msgsock, 1024))) {
echo "Read error";
} else {
echo "Data: ".$buf;
}
if (isset($sock)) {
socket_close($ret);
socket_close($sock);
}
echo "<br /> Socket closed";
Для того, чтобы считывать данные из сокета динамически я использую JQuery запрос.
Javascript (index.html):
function update_content() {
var request = $.get("socket/socketRead.php");
request.success(function(result) {
document.write(result);
});
}
update_content();
работал замечательно, пока я не попробовал добавить интервал считывания данных повторно.
Javascript (index.html):
var timer = setInterval(function(){update_content();}, 1000);
Первое соединение/получающее все еще работает, но тогда я получаю "Connection отказался" в программе C при попытке подключиться снова. Можете ли вы помочь мне с этой проблемой?
* «В соединении отказано» в программе C * - как вы сказали, это не PHP вопрос :-) функции сокетов PHP и C используют одни и те же системные вызовы, и я предлагаю использовать 'socket_select()' как в PHP, так и в C, попробуйте установить сокет 'nonblocking' – DanFromGermany
Ваш PHP-скрипт запускается один раз и завершается, он не запускается снова до тех пор, пока не истечет время Javascript, и может не запускаться снова вообще, если клиент уходит. На самом деле у вас это неправильно, программа C (постоянная сущность) должна прослушивать соединения, а PHP (временная сущность) должен быть подключен к ней. Делать это так круглый просят всевозможные проблемы и не будет жизнеспособным решением для чего-либо в производстве. – DaveRandom
DaveRandom lol Я даже не заметил, что .. @PaulPonomarev использует ['fsockopen();'] (http://php.net/fsockopen) для подключения php к программе C – DanFromGermany