Почему мой сервер Perl не может подключиться к порту 80? - PullRequest
0 голосов
/ 12 июля 2009

Я скопировал следующий скрипт и запустил его, чтобы прослушивать порт 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 ]

3 голосов
/ 12 июля 2009

На какой ты платформе? Как вы вызываете netstat?

В Windows XP, после запуска сценария с правами администратора, netstat -a дает мне:

TCP    aardvarkvi:http        aardvarkvi:0           LISTENING

Для привязки к портам ниже 1024 требуются права суперпользователя в *nix системах. Поскольку вы не проверяете (или, скажем так, код, который вы, похоже, скопировали вслепую), не проверяете возвращаемые значения различных вызовов, вы не узнаете, если они не сработали.

В общем, вам не нужно использовать Socket.pm. Используйте IO :: Socket и избегайте слепого копирования кода, не зная, что он делает.

Возможно, вы также захотите взглянуть на HTTP :: Daemon .

0 голосов
/ 13 июля 2009

Извините, моя ошибка, когда я запускаю netstat, я не поставил опцию -a. Когда используется netstat -a, он показывает этот порт.

0 голосов
/ 12 июля 2009

Вероятно, что 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 ):

    netstat -an | grep LISTEN | grep tcp
...