【发布时间】:2014-04-30 04:17:15
【问题描述】:
我有以下设置: 我的电脑是一个通过 WiFi 适配器的热点,上面运行着一个服务器应用程序(代码无关紧要且丑陋,但如果有问题我可以发布)。我电脑的IP地址是192.168.66.1。
我编写了一个向其发送 UDP 数据包的 android 应用程序,如果我将其发送到 255.255.255.255,该数据包只会出现在 wireshark 上。如果我尝试将目标更改为 192.168.66.255 或 192.168.66.1,它根本不会出现在 wireshark 上,并且设备上也不会报告错误。 (尝试单播时,我还将套接字更改为广播(假))
这是不起作用的发送代码:
public class ClientThread implements Runnable {
public ClientThread()
{
super();
}
private void sendCmd(DatagramSocket s, ByteArrayOutputStream cmd) throws Exception
{
InetAddress inet;
inet = getBroadcastAddress(getApplicationContext());
Log.d("ScreenToggler", inet.toString());
//DatagramPacket dataPacket = new DatagramPacket(cmd.toByteArray(), cmd.toByteArray().length, InetAddress.getByName("255.255.255.255"), ScreenToggler.SERVERPORT);
//s.setBroadcast(true);
DatagramPacket dataPacket = new DatagramPacket(cmd.toByteArray(), cmd.toByteArray().length, InetAddress.getByName("192.168.66.1"), ScreenToggler.SERVERPORT);
s.setBroadcast(false);
s.send(dataPacket);
Log.d("ScreenToggler", "Sent packet");
}
public void run() {
DatagramSocket socket = null;
try
{
try
{
socket = new DatagramSocket(ScreenToggler.SERVERPORT);
}
catch(Exception e)
{
Log.e("ScreenToggler", "S: Error", e);
return;
}
Log.d("ScreenToggler", "C: Connecting...");
System.out.println(CmdToSend.toByteArray().length);
sendCmd(socket, CmdToSend);
socket.close();
}
catch (Exception e)
{
Log.e("ScreenToggler", "S: Error", e);
try
{
socket.close();
}
catch(Exception e2)
{}
}
}
}
当我尝试使用此代码发送时,没有发生异常,流程正常继续,wireshark 上没有任何内容。没有迹象表明曾经出现过问题——比如我的机器人拒绝发送数据包。
如果我取消注释这两行
//DatagramPacket dataPacket = new DatagramPacket(cmd.toByteArray(), cmd.toByteArray().length, InetAddress.getByName("255.255.255.255"), ScreenToggler.SERVERPORT);
//s.setBroadcast(true);
并重新注释它们对应的两条线,数据包出现在wireshark上,并在我计算机上的服务器应用程序上正确接收。我电脑的防火墙已关闭。
这是我的权限清单文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="zomg.screenshutter"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="19" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="zomg.screenshutter.ScreenToggler"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
我拥有的其他可能相关信息是我的 android 的 IP 地址是 192.168.66.101,它识别 192.168.66.1 作为其网关(当我尝试通过 wifi 管理器获取网关地址时,它确实返回了我的计算机地址)。
我不知道我在这里缺少什么?
【问题讨论】:
-
你的网络掩码怎么样?我认为应该是 255.255.255.0。如果是,那么广播地址是 192.168.66.255
-
哪个也不做任何事情(将套接字设置为广播或单播时)。只有 255.255.255.255 有效 =\ 编辑:顺便说一下,我的网络掩码确实是 255.255.255.0,忘记确认
标签: android sockets networking udp