$socket = socket_create(AF_UNIX, SOCK_STREAM, 0);
socket_connect($socket, CLAMD_SOCKET);
socket_send($socket, 'PING', 4, 0);
socket_recv($socket, $output, 4, 0);
// check to see if $output === PONG (which it is)
$scan = 'SCAN ' . $file;
socket_send($socket, $scan, strlen($scan), 0);
socket_recv($socket, $output, 100, 0);
// $output should contain the result from the socket, but instead it's blank
// var_dump says it's a 1 character string " "
这是我的原始代码。
但是,如果我在 PING 命令后关闭套接字并返回 PONG(确实如此),然后再次重新打开它,SCAN 命令将起作用并按预期返回结果。
这是它应该如何工作的,还是我需要在命令之间做其他事情?套接字是否未准备好发送另一个命令?
我不太确定要寻找什么,我在 PHP 手册中找不到任何内容。它确实有效,但我觉得必须关闭套接字并重新打开它是错误的做法。
最佳答案
I can't find anything in the PHP manual.
该行为不取决于 PHP,而是取决于客户端和服务器之间使用的协议(protocol) - 即 clamd 期望并强制执行什么协议(protocol)。因此,在 PHP 文档中找不到有关此内容的信息,但需要查看 ClamAV 文档。
同时the clamd documentation描述了命令,不幸的是,如果允许多个命令,则缺少信息。不过,一个简短的测试(例如使用 netcat)显示,clamd 在响应命令后关闭连接,因此同一连接上不可能再执行更多命令。
It does work, but I feel as if having to close the socket and re-open it is the wrong way to do things.
这绝对不是最有效的方法,但与建立到远程系统的 TCP 连接相比,UNIX 域套接字甚至本地 TCP 套接字创建新连接的开销很低。
要能够发送多个命令并因此获得多个响应,就需要明确区分命令和响应的结束位置。这是针对命令的记录,但不是针对响应的记录。因此,这里唯一明显的选择是读取直到连接结束,即直到连接关闭。这种设计使得在已建立的连接上发送更多命令变得不可能。
关于php - 我可以在不关闭并重新打开连接的情况下向 clamd 套接字(ClamAV 守护程序)发送多个命令吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73839159/