2

我的机器上有两个网卡,配置了两个独立的 IP 地址。两个 IP 地址都属于同一个网络。我是否正确地说,当我创建一个特定于这些 IP 地址之一的套接字时?

更新:

这是我的情况:

我有一个位于 192.168.0.10 的硬件设备。它通过 udp 与 (192.168.0.11, 50000) 和 (192.168.0.12, 50000) 通信。硬件设备通过两个端口执行此操作,如下所示:(192.168.0.10, 49000) 和 (192.168.0.10, 49001)。

我通过脚本创建端口 (192.168.0.11, 50000) 和 (192.168.0.12, 50000),以便记录和操作通信,然后将数据转发到两个能够与硬件通信的模拟器。

所以实际上,我的脚本是“中间人”,我在其中记录和破坏数据以测试硬件。

这是我的脚本的套接字接口:

IP 1 - Channel 1

External_socket = (192.168.0.10, 49000) ** Hardware
External_side_socket = (192.168.0.11, 50000) ** Script
Simulator_side_socket = (192.168.0.11, 50001) ** Script
Simulator_socket = (192.168.0.11, 50002) ** Simulator

IP2 - Channel 2

External_socket = (192.168.0.10, 49001) ** Hardware
External_side_socket = (192.168.0.12, 50000) ** Script
Simulator_side_socket = (192.168.0.12, 50001) ** Script
Simulator_socket = (192.168.0.12, 60002) ** Simulator

这按预期工作,并且为每个通道记录了正确的数据。

但是,如果我进行两个简单的更改,它就会停止工作:

1)我将第二个模拟器的配置文件从60002改为50002,同时保持ip地址为192.168.0.12。

2) 在我的脚本中,我还将 IP2 的 60002 更改为 50002。

突然,来自第二个通道的数据到达了第一个模拟器。怎么会这样?.net 有一个IPAny,我想知道模拟器是否以某种方式使用它并忽略其配置文件中的 IP 地址。你认为这可能是这里的问题吗?

谢谢,

巴里

4

2 回答 2

0

我会说这是正确的。取决于您要在语句中使用的抽象级别。

创建套接字时,它不会绑定到 IP 地址。查看有关Berkeley 套接字的 Wikipedia 文章,您会看到第一个创建 socket( socket()) 声明套接字类型系列。然后将套接字绑定 ( bind()) 到一个地址,例如 10.0.0.1。然后,根据您要使用的套接字,您可以将其设置为侦听、接受或连接。

本地主机具有与任何其他设备一样的 IP 地址,即 127.0.0.1。您创建套接字并将其绑定到 127.0.0.1。然后,该套接字就像您可以与之通信的任何其他套接字一样工作。

您还可以阅读有关Network Socket的 Wikipedia 文章。

于 2012-04-12T09:00:27.473 回答
0

您可以bind使用 value INADDR_ANY,这意味着不绑定到任何特定的网络接口,因此您可以忽略运行程序的 IP 地址。

参考这里这里

于 2015-11-30T11:58:59.933 回答