gpt4 book ai didi

java - Android: java.net.DatagramSocket.bind: 无效参数异常

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:22:15 26 4
gpt4 key购买 nike

背景:我正在编写一个简单的 UDP 应用程序来 ping 我管理的 beta 服务器,告诉我它仍然正常运行(对于那些想知道的人,我无法在服务器上启用 ping)。我计划在我的手机上运行它,以便在服务器不再响应时警告我。

我正在尝试使用看似简单的 java.net.DatagramSocket:

    try
{
socket = new DatagramSocket();
socket.bind(null);
}
catch (SocketException e)
{
System.out.println(e.toString());
throw e;
}

我还要说一下,我已经通过 android list 启用了 Internet 权限,如果我为此删除了 uses 子句,我会收到权限错误,所以我确信它工作正常。当我将此代码下载到 Android 虚拟设备 (AVD) 并执行它时,在调用 bind() 时出现以下异常:

03-17 19:07:39.401: INFO/System.out(338): java.net.BindException: 无效参数

根据 this文档,null 参数是正确的:

public void bind (SocketAddress localAddr)

Since: API Level 1

Binds this socket to the local address and port specified by localAddr. If this value is null any free port on a valid local address is used.

但由于不信任文档,我决定像这样在我的设备上枚举 IP 地址:

    ArrayList<NetworkInterface>  allInterfaces = Collections.list(NetworkInterface.getNetworkInterfaces());

NetworkInterface eth = allInterfaces.get(0);

InetSocketAddress addr = new InetSocketAddress(eth.getInetAddresses().nextElement(), port);

try
{
socket = new DatagramSocket();
socket.bind(addr);
}
catch (SocketException e)
{
System.out.println(e.toString());
throw e;
}

当我单步执行代码时,它运行良好,我可以在 AVD 上看到两个 IP 地址,但我在 bind() 调用中得到完全相同的异常。外面有人看到我可能遗漏了什么吗?我将继续研究并希望发布解决我自己问题的方法,但我希望有人能够为我提供捷径。

最佳答案

[已编辑:如果您看到我之前的回复,我犯了一个经典的调试错误,即在一个测试中更改了两个变量,而另一个解决了我的问题。]

我发现了问题。这是我声明似乎会导致问题的 DatagramSocket 的方式。如果我使用 DatagramChannel 按以下方式打开 DatagramSocket,则 bind() 调用成功。

      DatagramChannel channel = DatagramChannel.open();
DatagramSocket socket = channel.socket();

关于java - Android: java.net.DatagramSocket.bind: 无效参数异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5347303/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com