为什么我的Perl服务器无法绑定到端口80?

时间:2009-07-12 12:52:37

标签: perl sockets netstat

我复制了以下脚本并运行它以使其在端口80上侦听。但是netstat没有显示端口80.为什么netstat没有播放它,或者Perl脚本不正确?

#!/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;

3 个答案:

答案 0 :(得分:3)

你在哪个平台上?你是如何调用netstat的?

在Windows XP上,在运行具有管理员权限的脚本后, netstat -a 给了我:

TCP    aardvarkvi:http        aardvarkvi:0           LISTENING

绑定到1024以下的端口需要*nix系统上的root权限。既然你没有(或者,我应该说,你似乎盲目复制的代码没有)检查各种调用的返回值,你不会知道它们是否失败。

通常,您不必使用Socket.pm。坚持IO::Socket并避免盲目复制代码而不知道它的作用。

您可能还想查看HTTP::Daemon

答案 1 :(得分:0)

netstat可能正在用/etc/services中的名称替换数字端口号。例如:

    ~, 503> netstat -a | more
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State
    tcp        0      0 *:svn                   *:*                     LISTEN

你可以做的一件事是grep netstat的输出来查找它正在监听的所有套接字:

    netstat -a | grep LISTEN | grep tcp

您还可以告诉netstat显示数字地址而不是执行主机名或服务查找(还有另一个选项,您可以限制端口号;执行 man netstat ):< / p>

    netstat -an | grep LISTEN | grep tcp

答案 2 :(得分:0)

抱歉,我的错,当我运行netstat时,我没有把选项-a。当使用netstat -a时,它显示该端口。