像ping,ssh这样的Unix命令工作得很好但是基于套接字的程序在连接中失败了

时间:2008-09-18 19:36:43

标签: linux sockets suse

我接到一位测试人员的电话,询问我们软件出现故障的机器。当我检查问题机器时,我很快意识到问题是相当低的水平:入站网络流量工作正常。像ping和ssh这样的基本出站命令工作正常,但涉及connect()调用的任何内容都失败了“没有到主机的路由”。

例如 - 在此特定计算机上,对于除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 个答案:

答案 0 :(得分:2)

我会检查该机器上的防火墙配置。 iptables(我想你的SUSE有iptables防火墙)可以设置为只通过ping ICMP数据包。

答案 1 :(得分:1)

防火墙是否已关闭?

答案 2 :(得分:0)

防火墙总是可行的,但确实说ssh可以连接,所以这似乎不太可能。 我想看一下路由(Linux上的“route”命令),并确保你没有两个默认路由,或者奇怪的路由或其他什么。总而言之,我会说同一个远程IP上的测试ping和ssh以及你的程序,如果它们都失败了,你就会遇到路由问题。如果只有你的程序失败,你可能有防火墙问题或程序问题:)

答案 3 :(得分:0)

尝试将connect()指向同一主机:SSH命令工作的端口。此外,请记住,某些防火墙可以为不同的用户帐户(有时为不同的可执行文件)应用不同的规则。因此,请确保在同一用户帐户下运行ssh和测试应用程序,并且没有为SSH设置SUID。