2

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] プロセスはブロックするだけです。サーバーがシャットダウンされると、クライアントのブロックが解除され、上記の行の後にコンソールに書き込まれたすべてがシェルによって解釈されます。

私は成功しなかった答えを探していましたが、私が読んだことから、これは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
4

1 に答える 1

2

私がやろうとしているのは、netcatを使用してファイルのコンテンツを送信し、同じコンソールを使用してメッセージを送信できるようにすることです。

コンソールはありません。netcatは標準入力から読み取っているだけです。ファイルをそのファイルにリダイレクトする場合、ファイルが終了すると、他に読み取るものはありません。

これを試して:

(cat file ; cat ) | netcat 192.168.1.10 3320 
于 2012-04-20T17:42:21.200 に答える