当前位置: 首页 > 面试题库 >

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

辛渝
2023-03-14
问题内容

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

我试图像这样使用看似简单的java.net.DatagramSocket:

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

我还要说一句,我已通过android清单启用了Internet权限,如果删除了use子句,则会出现权限错误,因此我确定可以正常工作。当我将此代码下载到Android虚拟设备(AVD)并执行它时,在对bind()的调用中,出现以下异常:

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

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

公共无效绑定(SocketAddress localAddr)

由于:API级别1

将此套接字绑定到localAddr指定的本地地址和端口。 如果此值为null,则使用有效本地地址上的任何可用端口

但是我不信任文档,因此决定枚举设备上的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();


 类似资料:
  • 运行代码后,我得到以下错误:线程“main”org . open QA . selenium . invalidargumentexception中的异常:无效参数(会话信息:chrome=103.0.5060.114)构建信息:版本:“4.3.0”,修订版:“a4995e2c09*”系统信息:主机:“SADAF-RAUF”,IP:“192 . 168 . 1 . 55”,OS . name:“W

  • 问题内容: 有人知道为什么chrome参数不起作用吗? 我也尝试过在切换台之前不加“-”并仅给出一个参数… Chrome启动,但没有激活的标志。 我使用最新的chromedriver。 问题答案: 我最近发现的类不与当前的硒和铬出于某种原因(如硒2.33.0,铬30和2013年7月)正常工作。 我相信,我链接的答案也是您解决问题的方法。只需使用,这些对我来说一直很好:

  • 我想让它在每天每小时的第5,15,25,35,45和55分钟运行。这似乎与这里的AWS调度事件文档一致http://docs.AWS.amazon.com/amazoncloudwatch/latest/Events/scheduledevents.html。 上面的文档允许用0到59之间的逗号分隔值表示分钟,并使用*通配符反映小时、月日(或周日)、月和年。 我尝试在Lambda控制台(创建函数并

  • 我正在上载excel工作表,并希望将其数据移动到数据库中的另一个表中。最近两天我收到了一个错误(),但是,如果我设计了一个非常简单的应用程序,它就可以正常工作。请帮帮我

  • 当我试图从我的api中点击以从keydove对用户进行身份验证时,它给了我一个错误无效参数:keydove页面上的redirect_uri。除了师父,我创造了自己的王国。KeyClope正在http上运行。请帮帮我。

  • 问题内容: 我想在两个不同的程序之间发送一个打开的文件描述符。所以我用用这样做。但是我收到了ioctl的无效参数。 文件附件.h仅包含一些常见的包含文件,而没有其他内容。首先,我发送一条简单的消息,然后调用该方法,该方法首先发送2字节消息,然后必须使用ioctl发送文件描述符。但事实并非如此。 问题答案: 看来linux不支持I_SENDFD。注释表明该内容在文档中,但实际上不受支持,并会导致您遇