【发布时间】:2015-03-14 15:25:25
【问题描述】:
我编写了一个 Android 程序来接收多播数据包。 代码在下面。 问题是我可以收到正常的数据包, 但我无法接收错误 UDP 长度 > IP PAYLOAD 长度的数据包。 我猜这些伪造的数据包被某人下垂了。 如何在Android中接收假数据包,谢谢!
public class SSDP extends Thread {
/**
* Default IPv4 multicast address for SSDP messages
*/
public static final String ADDRESS = "239.100.10.100";
public static final String LOG_TAG = "SSDP";
public static final boolean DEBUG = false;
private SocketAddress mMulticastGroupAddress = new InetSocketAddress("239.100.10.100", 2060);
private MulticastSocket mMulticastSocket;
private DatagramSocket mUnicastSocket;
private NetworkInterface mNetIf;
private Context mContext;
private boolean mRunning = false;
private byte[] mFrameNumber, mNowFrameNumber, mSequenceNumber, mNowSequenceNumber;
private ByteArrayBuffer mReadBuffer;
private boolean mLast = false;
final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
public static String bytesToHex(byte[] bytes) {
char[] hexChars = new char[bytes.length * 2];
for ( int j = 0; j < bytes.length; j++ ) {
int v = bytes[j] & 0xFF;
hexChars[j * 2] = hexArray[v >>> 4];
hexChars[j * 2 + 1] = hexArray[v & 0x0F];
}
return new String(hexChars);
}
public SSDP(Context ctx) throws IOException {
mContext = ctx;
mNetIf = Utils.getActiveNetworkInterface();
}
@Override
public synchronized void start() {
mRunning = true;
super.start();
}
@Override
public void run() {
try {
mMulticastSocket = new MulticastSocket(2060);
mMulticastSocket.setLoopbackMode(true);
mMulticastSocket.joinGroup(mMulticastGroupAddress, mNetIf);
mUnicastSocket = new DatagramSocket(null);
mUnicastSocket.setReuseAddress(true);
mUnicastSocket.bind(new InetSocketAddress(Utils.getLocalV4Address(mNetIf),2060));
} catch (IOException e) {
UtilLog("Setup SSDP failed: " + e);
}
while(mRunning)
{
DatagramPacket dp = null;
try
{
dp = receive();
//do somethins
}
catch (IOException e)
{
UtilLog("SSDP fail: " + e);
}
}
UtilLog("SSDP shutdown.");
}
public synchronized void shutdown() {
mRunning = false;
}
private void UtilLog(String message)
{
if(DEBUG)
Log.d(LOG_TAG, message);
}
private DatagramPacket receive() throws IOException {
byte[] buf = new byte[1500];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
mMulticastSocket.receive(dp);
return dp;
}
}
【问题讨论】:
-
对于目标 DatagramPacket 太长的数据包,如果收到的话,应该被截断。对于套接字接收缓冲区来说太大的数据报可能会被完全丢弃。数据报是怎么变得这么大的?对于 UDP,您通常应该将自己限制为 534 字节的有效负载,当然不超过 PATH_MTU。
标签: android sockets networking udp multicast