0

次のスクリプトをコピーして実行し、ポート 80 でリッスンするようにしました。しかし、ポート 80netstatが表示されませnetstatん。

#!/usr/bin/perl -w
use Socket;
use IO::Handle; 

$port=80; 
$host='localhost'; 
$packhost=inet_aton($host); 
$address=sockaddr_in($port,$packhost); 

socket(SERVER,AF_INET,SOCK_STREAM,getprotobyname('tcp')); 
bind(SERVER,$address); 
listen(SERVER,10); 

while( 1 ) {
    next unless (accept(CLIENT,SERVER)); 
    CLIENT->autoflush(1); 
    $msg_out="WHAT DO YOU WANT?\n"; 
    send(CLIENT,$msg_out,0); 
    close CLIENT;
} 

close SERVER; 
exit 1;
4

3 に答える 3

3

どのプラットフォームを使用していますか? どのように呼び出していnetstatますか?

Windows XP では、管理者権限でスクリプトを実行すると、次のようになりnetstat -aます。

TCP aardvarkvi:http aardvarkvi:0 リスニング

1024 未満のポートにバインドするには、*nixシステムのルート権限が必要です。さまざまな呼び出しの戻り値をチェックしない (または、やみくもにコピーしたと思われるコードはチェックしない) ため、それらが失敗したかどうかはわかりません。

一般に、Socket.pm を使用する必要はありません。IO::Socketに固執し、コードが何をするかを知らずにやみくもにコピーすることは避けてください。

HTTP::Daemonも調べてみてください。

于 2009-07-12T13:01:17.880 に答える
0

申し訳ありませんが、netstat を実行するときに -a オプションを付けませんでした。netstat -a を使用すると、そのポートが表示されます。

于 2009-07-13T07:48:37.420 に答える
0

netstat数値のポート番号を from の名前に置き換えている可能性があります/etc/services。例えば:

    ~, 503> netstat -a | もっと
    アクティブなインターネット接続 (サーバーと確立済み)
    Proto Recv-Q Send-Q ローカル アドレス 外部アドレス 状態
    tcp 0 0 *:svn *:* リッスン

できることの 1 つは、 grepnetstatの出力を使用して、リッスンしているすべてのソケットを見つけることです。

    netstat -a | grep リッスン | grep tcp

netstatホスト名やサービスのルックアップを行うのではなく、数値アドレスを表示するように指示することもできます (また、ポート番号だけを制限できる別のオプションもあります; do man netstat):

    netstat -an | grep リッスン | grep tcp
于 2009-07-12T13:01:18.737 に答える