eof — подключиться к прослушиванию netcat, используя переполнение стека

У меня есть сервер Netcat, работающий из командной строки:

netcat -l -q0 -p 9999 -c "tesseract stdin stdout -l spa"

Я могу подключиться к этому серверу с помощью клиента Netcat:

cat /tmp/autogenerado.jpg | netcat 127.0.0.1 9999

Итак, я отправляю файл jpeg на другой сервер и получаю данные OCR в клиенте.

Я хочу сделать это на PHP:

$fp = fsockopen("tcp://127.0.0.1:9999", $errno, $errstr);

if (!$fp) {
echo "{$errno}: {$errstr}\n";
die();
}

fwrite($fp, $jpeg);

$contents = stream_get_contents($fp);

fclose($fp);

return $contents;

Но скрипт висит на stream_get_contents, Я думаю, это потому, что сервер netcat не знает, когда клиент PHP завершил отправку данных.

Можно ли отправить EOF?

2

Решение

Вы должны закрыть сокет для записи, что-то вроде этого:

<?php
$stream = stream_socket_client("tcp://whatever:9999", $errno, $errstr);

if (!$stream) {
echo "{$errno}: {$errstr}\n";
die();
}

fwrite($stream, $jpeg);

stream_socket_shutdown($stream, STREAM_SHUT_WR); /* This is the important line */

$contents = stream_get_contents($stream);

fclose($stream);

return $contents;
?>
2

Другие решения

Для справки, окончательный рабочий код:

$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$result = socket_connect($sock, "10.187.252.35", 9999);
socket_send($sock,$bdata,strlen($bdata),MSG_EOR):
socket_shutdown ($sock,1);
while ($out = socket_read($sock, 2048)) {
echo $out;
}
socket_close($sock);
0

По вопросам рекламы [email protected]