【问题标题】:Socket communication over internet Perl通过 Internet Perl 进行套接字通信
【发布时间】:2013-12-26 06:35:12
【问题描述】:

如何使套接字在 Internet 上工作?

对于 TCP 服务器,我在本地 IP 中创建了一个套接字,并设置了从路由器转发的端口。

对于客户端,我将路由器的 IP 地址指定为 PeerAddr(对等地址)。从远程计算机启动客户端时,它不起作用。

~抱歉,我现在清楚了,下面是 sn-p~
已更新: 服务器片段:

$server_socket = new IO::Socket::INET (
                     LocalHost => '192.168.0.4',
                     LocalPort => '1080',
                     Proto     => 'tcp',
                     Listen    => 300,
                     Reuse     => 1,
                     Type      => SOCK_STREAM,
                 )
                   or die "ERROR in Socket Creation: $!\n";

客户端片段:

my $socket = IO::Socket::INET->new (
                 PeerHost => '117.97.148.228',# router ip example
                 PeerPort => '1080',
                 Proto    => 'tcp',
             );

我错过了什么?

【问题讨论】:

  • “不工作”是什么意思。它会死吗?还是什么都不做?
  • 抛出错误..“无法连接到 remote_host:: 请求的地址在其上下文中无效。”
  • 您正在使用LocalHost 这意味着本地监听设备。您显示的错误与客户端有关
  • Stack Overflow 使用 markdown 语法来格式化帖子。请优先使用它而不是 HTML 标记。谢谢。
  • 我是新人,以后会改正

标签: perl sockets tcp


【解决方案1】:

如果您没有在路由器本身上运行此代码,则您尝试连接的主机/端口不是“本地”。请改用PeerAddrPeerPort

如果这不起作用,我们需要更多信息。至少,告诉我们如何它失败了。理想情况下,提供一个简短但可运行的独立示例,以便我们自己尝试看看哪里出了问题。

另外,作为旁注,使用间接对象表示法 (new IO::Socket::INET) 通常被认为是一种已弃用的做法。直接对象表示法 (IO::Socket::INET->new) 是当前公认的做法,因为它避免了潜在的歧义和 perl 二进制文件的不正确解析。

【讨论】:

  • 你是对的。现在我已经更新了我的问题,你可以现在给我建议吗
【解决方案2】:

最可能的答案是路由器尚未正确配置。如果您不确定您的 perl 代码,请使用 netcat 或 telnet 等工具在本地和远程测试连接。我希望您会发现库存 tcp 工具也无法远程连接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 2012-12-19
    相关资源
    最近更新 更多