Команды Unix, такие как ping, ssh, работают нормально, но программы, основанные на сокетах, не могут подключиться - PullRequest
1 голос
/ 18 сентября 2008

Мне позвонил тестер по поводу машины, на которой не работает наше программное обеспечение. Когда я исследовал проблемный компьютер, я быстро понял, что проблема была довольно низкой: входящий сетевой трафик работает нормально. Основные исходящие команды, такие как ping и ssh, работают нормально, но все, что связано с вызовом connect(), завершается с ошибкой «No route to host».

Например - на этой конкретной машине эта программа не выполнится в операторе connect() для любого IP-адреса, кроме 127.0.0.1:

#!/usr/bin/perl -w
use strict;
use Socket;
my ($remote,$port, $iaddr, $paddr, $proto, $line);

$remote  = shift || 'localhost';
$port    = shift || 2345;  # random port
if ($port =~ /\D/) { $port = getservbyname($port, 'tcp') }
die "No port" unless $port;
$iaddr   = inet_aton($remote)           || die "no host: $remote";
$paddr   = sockaddr_in($port, $iaddr);

$proto   = getprotobyname('tcp');
socket(SOCK, PF_INET, SOCK_STREAM, $proto)      || die "socket: $!";
connect(SOCK, $paddr)    || die "connect: $!"; 
while (defined($line = <SOCK>)) {
    print $line;
}

close (SOCK)        || die "close: $!";
exit;

Любые предложения о том, где эта машина сломана? Работает SUSE-10.2.

Ответы [ 4 ]

2 голосов
/ 18 сентября 2008

Я бы проверил конфигурацию брандмауэра на этой машине. Iptables (я полагаю, в вашем SUSE установлен брандмауэр iptables) можно настроить так, чтобы он пропускал только пакеты ICMP.

1 голос
/ 18 сентября 2008

Брандмауэр выключен?

0 голосов
/ 19 сентября 2008

Попробуйте указать connect () на тот же порт host:, где работает ваша команда SSH. Также имейте в виду, что некоторые брандмауэры могут применять разные правила для разных учетных записей пользователей (а иногда и для разных исполняемых файлов). Поэтому убедитесь, что вы запускаете ssh и тестовое приложение под одной и той же учетной записью пользователя, а SUID не установлен для SSH.

0 голосов
/ 19 сентября 2008

Брандмауэр всегда возможен, но он говорит, что ssh может подключиться, так что это кажется маловероятным. Я бы сказал, посмотрите на маршруты (команда «route» в Linux) и убедитесь, что у вас нет двух стандартных маршрутов, странных или каких-то еще. В общем, я бы сказал, проверить ping и ssh и вашу программу на одном и том же удаленном IP-адресе, и если они все не пройдут, у вас проблема с маршрутом. Если происходит сбой только вашей программы, возможно, у вас проблема с брандмауэром или с программой :)

...