DatagramSocket.bind();套接字异常:无法分配请求的地址。 Android模拟器

时间:2011-03-02 12:40:37

标签: android sockets android-emulator udp

我是Android和Java的新手所以请原谅我的问题 在不适当的小组或论坛上被问到。我做了一个.Net 申请我的公司,最近他们让我把它移植 Android以便在三星Galaxy Tabs上安装它。

首先,我使用Eclipse,JDK 6,目标平台android 2.2 和一个带有GalaxyTab插件的模拟器。我的操作系统是Windows 7。

此应用程序,发送和接收某些消息 使用UDP在网络上的控制器。 简而言之,我的应用程序使用“DatagramSocket”,将其绑定到本地 “InetSocketAddress”然后启动一个侦听的线程 数据报,而另一个线程向控制器发送请求 用户的请求。这是一些代码片段:

这是我分配本地地址和套接字的地方:

try {
     loc_addr = new InetSocketAddress(
       Inet4Address.getByAddress(
              new byte[]{(byte) 192,(byte) 168,1,(byte)240}), 0xBAC0); 
       //192.168.1.240 is the IP of my machine on the network
} catch (UnknownHostException e) {
     .......
}
try {
     soc = new DatagramSocket();
     soc.setReuseAddress(true);
     soc.setBroadcast(true);
     soc.bind(loc_addr);
} catch (SocketException e) {
     .......
}

这是我收听传入数据报的地方:

try{
     buf = new byte[1024];
     receive_pac = new DatagramPacket(buf, 1024);
     soc.receive(receive_pac);
     if (receive_pac.getData() != null){
     .......
     }
}

这是我发送数据的地方:

try {
    addr = (Inet4Address) Inet4Address.getByAddress (new byte[]
{(byte) 192,(byte) 168,1,(byte) 255}); //The message I am sending should be broadcasted
} catch (UnknownHostException e) {
    ......
}
sendPacket = new DatagramPacket(buf, buf.length, addr,
loc_addr.getPort());
try {
    soc.send(sendPacket);
} catch (IOException e) {
    ......
}

当我使用“soc.bind(...)”时,我收到以下异常: 无法分配请求的地址

然后我收到一条调试消息(我不知道它是否相关):

DEBUG/SntpClient(58): request time failed: java.net.SocketException: Address family not supported by protocol

应用程序正在运行,我通过“WireShark”验证了当我 从仿真器请求将数据发送到控制器, 控制器正确回复预期的数据。然而 套接字,在应用程序中,在模拟器上没有收到任何东西并保持阻塞状态 “接收”电话!

任何人都可以帮我弄清楚我在申请表的接收部分遇到了什么问题或错误!

非常感谢任何帮助,

2 个答案:

答案 0 :(得分:8)

TMI,

[编辑:如果你看到我的另一个答案,请忽略,我犯了一个经典的错误,即在一次测试中改变两个变量,而另一个变量就是差异。]

关于这一点:

  

我尝试将它绑定到套接字,结果是“SocketException:Invalid Argument”。程序仍然执行相同的操作!你知道这个例外可能意味着什么吗?

你现在可能已经解决了这个问题,但我只是有同样的问题并自己回答here

为我摆脱这个例外的是改变我创建DatagramSocket的方式。

发件人:

sock = new DatagramSocket();

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

答案 1 :(得分:0)

如果您尝试绑定到您不拥有的IP地址,通常会看到该错误消息。您确定Android模拟器的IP地址是192.168.1.240吗?仿真器IP可能与主机IP不同。