php - 我可以在不关闭并重新打开连接的情况下向 clamd 套接字(ClamAV 守护程序)发送多个命令吗?

标签 php sockets clamav

    $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/

相关文章:

clam - 无法停止 Linux 中的 Clamav 守护进程

linux - LibClamAV 错误 : cli_loaddbdir(): No supported database files found in/var/lib/clamav

php - 简单的 PHP 邮件程序缺少一些位

php - 如何使MySQL表中的图像根据id改变

php - 选择时是否会出现某些标准?

php - ASyncTask HTTP 错误

c - C 和 Linux 中的套接字连接问题

java - 带套接字的 BufferedReader 和 BufferedWriter

c - 为 winsock recvfrom 设置超时