【问题标题】:Socket, bound to an address, cannot connect to a listener except when bound to 127.0.0.1 on Win XP绑定到地址的套接字无法连接到侦听器,除非在 Win XP 上绑定到 127.0.0.1
【发布时间】:2014-06-25 05:08:27
【问题描述】:

我创建了一个套接字并将其绑定到 127.0.0.254,然后尝试使用

连接到 0.0.0.0 443 上的 httpListener
socket= new Socket();
socket.bind("127.0.0.254:0");
socket.connect("127.0.0.1",443);

连接失败,出现异常“No route to host” 不过,相同的代码块在 win 8 上运行良好。

附加信息:

我将它绑定到 0。我的问题是,我每 5 分钟探测一次侦听器以查看它是否启动。为此,我尝试将套接字绑定到 .254 地址,然后通过尝试连接的套接字地址确定它是探针还是真实的。这在 XP 上不起作用,因为套接字连接失败。但如果我不绑定,套接字将采用 127.0.0.1 地址,我无法区分。我的方案有什么解决方法吗?

【问题讨论】:

  • 调用socket.bind("127.0.0.254:0");是否成功?你测试它的失败结果吗?您呼叫bind()on 的机器是否有带有127.0.0.254 的接口设置?
  • 绑定成功,没有错误,我检查了。仅当您将其连接到 127.0.0.1 443 地址时才会失败。位于 0.0.0.0 443 上的侦听器意味着它在同一端口上获取任何 ip。至少我认为它是这样做的。

标签: java sockets windows-xp


【解决方案1】:

我怀疑 XP 没有正确处理 127.x.y.z 地址范围的环回适配器。我怀疑如果你从另一个绑定到 127.0.0.1 的套接字连接到 127.0.0.1,你会没事的。但是您在示例中使用了相同的源端口和目标端口 (443)。

您真的需要客户端端口也位于 443 上吗?服务器(侦听套接字)绑定到众所周知的端口通常是有意义的,但客户端可以绑定到任何端口。

因此,这应该适用于所有平台:

socket= new Socket();
socket.bind("127.0.0.1:0");
socket.connect("127.0.0.1",443);

或者更好的是,不要显式绑定。操作系统将检测到您正在建立回送连接并隐式执行适当的绑定。

socket= new Socket();
socket.connect("127.0.0.1",443);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    • 2015-12-25
    • 2013-05-25
    相关资源
    最近更新 更多