【问题标题】:Sending TCP packets over internet (using Ruby)通过 Internet 发送 TCP 数据包(使用 Ruby)
【发布时间】:2012-10-28 06:55:30
【问题描述】:

我正在尝试学习如何通过 Internet 将 TCP 数据包发送到另一台计算机。比如说,计算机 1 通过 Internet 将数据发送到计算机 2(使用 TCP)。假设两台计算机都正确设置了端口转发,我将如何在两台计算机之间建立 TCP 连接(最好是 Ruby)?我有它在我的局域网上运行,但是当我通过互联网尝试时,它似乎不起作用。

我的尝试(基本上):

计算机 1:

server = TCPServer.new 32500
client = server.accept

计算机 2:

TCPSocket.new PUBLIC_IP_OF_COMPUTER_1, 32500

问题是 TCPSocket 从不连接 TCPServer。

我在 Ruby 文档中读到 TCPServer.new 的语法是

new(remote_host, remote_port, local_host=nil, local_port=nil)

如果我只保留 local_host=nil 和 local_port=nil(而不是为它们分配计算机 1 上的私有 IP 和端口 32500 号)会发生什么?

如果有人能指出我正确的方向,那就太好了!我希望我的方法至少在某种程度上是正确的。

【问题讨论】:

标签: ruby sockets networking tcp tcpclient


【解决方案1】:

您创建了一个仅在环回接口上侦听的服务器。

试试这个:

curl ifconfig.me

您将获得您的外部 IP 地址,它是如何从外部看到的,例如 123.123.123.123

server = TCPServer.new 2000

现在你有一个监听 2000 端口的服务器

lsof -i :2000

例如:

ruby 37186​​ wopi 6u IPv4 0xcf0818acc2bdc38d 0t0 TCP *:callbook (LISTEN)

现在从同一台机器连接到本地主机

telnet localhost 2000

这行得通

telnet 123.123.123.123 2000 # substitute your real external IP address

这行不通

这就是为什么你无法从外部连接。

查看 ngrep、netcat 和 tcpdump 是如何工作的,它们是网络调试的宝贵工具。

【讨论】:

  • 嗨,你知道我在哪里可以找到关于这些东西的更多文档吗?例如,Ruby 似乎没有一个名为 Curl 的类,是否可以使用 TCPSocket 而不是 telnet?
  • curl 是一个二进制文件,你在 bash/zsh shell 中输入它,而不是在 ruby​​ 控制台中输入,与我帖子中的 telnet、netcat 和 lsof 相同。你有 curl 的红宝石绑定,称为遏制,但这是另一个故事,与你无关。
  • 您可以很好地使用 netcat 来通过网络(telnet)进行通信,但这是一个二进制文件,而不是 ruby​​ 库。当你想用 ruby​​ 做网络工作时,请查看我在上面的命令中发布的书。
猜你喜欢
  • 1970-01-01
  • 2022-11-12
  • 2023-03-12
  • 2013-09-16
  • 2018-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-25
相关资源
最近更新 更多