php - 当使用 netcat 作为客户端发送文件或管道输出时,如何避免 netcat 阻塞?

标签 php sockets netcat

当我使用 netcat 与使用输入文件或管道在 TCP 套接字上监听的服务器通信时,客户端会挂起,并且我无法发送任何输入。知道如何让它不被阻止吗? 在这个问题的最后,有我为此使用的“服务器”的代码,它在 PHP 上运行。

如果我从终端执行此操作:

netcat 192.168.1.10 3320

然后我可以无限期地与服务器对话,它只是回显我发送的每一行(LF)。

但是如果我这样做:

netcat 192.168.1.10 3320 < file
or
echo "Something" | netcat 192.168.1.10 3320 

然后服务器返回文件内容,但我无法再与netcat通信。 [client] 进程只是阻塞。一旦服务器关闭,客户端就会解除阻塞,并在 shell 解释上面的行之后在控制台上写入的所有内容。

我一直在寻找答案但没有成功,但根据我所读到的内容,这是 netcat 的问题。一旦看到 EOF,它就会将连接视为已关闭。

我尝试了等待选项并一直阻塞:

netcat -q -1 192.168.1.10 3320 < file

没有成功。 我想做的是使用 netcat 发送文件的内容,然后能够使用相同的控制台发送消息。

“服务器”:

<?php

set_time_limit(0);
$address = "192.168.1.10";
$port = 3320;
$server_users = 3; 
$mysock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("Could not create socket\n");
$bind_result = socket_bind($mysock,$address, $port) or die("Could not bind to address\n"); 
$listen_result = socket_listen($mysock, $server_users)  or die("Could not set up socket listener\n");
$client = socket_accept($mysock) or die("Could not accept the connection to socket\n");

do {
    $input = socket_read($client,1024,PHP_BINARY_READ);
    echo $input;
} while(TRUE);
?>

如果您现在需要,我可以使用以下命令在终端中运行它:

$ php -q server.php

最佳答案

What I am attemting to do is to do is to send the content of a file with netcat and then be able to send messages using the same console.

没有控制台,net​​cat 只是从标准输入读取。如果您将文件重定向到它,一旦完成,就没有其他内容可读取。

试试这个:

(cat file ; cat ) | netcat 192.168.1.10 3320 

关于php - 当使用 netcat 作为客户端发送文件或管道输出时,如何避免 netcat 阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10250003/

相关文章:

c - 如何创建自己的数据包以通过 UDP 发送?

bash - 将十六进制转换为二进制并通过网络发送

linux - 如何修改netcat的输入流?

smtp - 通过 netcat 发送邮件时出现 "530 5.7.0 Must issue a STARTTLS command first."错误

php - Doctrine:不能为子查询分配别名

php - 在 PHP 中,为什么我的 session 变量保留为引用?

c - 套接字缓冲区读取器的问题

php - 使用 MMCache 或 Zend Accelerator 等 PHP 加速器是否可以使 PHP 更快?

php - 如果数据库中有3个不同的字段名称,如何搜索全名?

python - 获取 socket.gaierror : [Errno 8] nodename nor servname provided, 或未知