当使用它作为客户端发送文件或流水线输出时,如何避免netcat阻塞?

时间:2012-04-20 16:30:49

标签: 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通信了。 [客户端]进程只是阻止。一旦服务器关闭,那么客户端解除阻塞,并且在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

1 个答案:

答案 0 :(得分:2)

  

我正在做的是发送文件的内容   使用netcat,然后能够使用相同的控制台发送消息。

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

试试这个:

(cat file ; cat ) | netcat 192.168.1.10 3320