/** * Gets a <tt>MultiplexedDatagramSocket</tt> which filters <tt>DatagramPacket</tt>s away from this * <tt>DatagramSocket</tt> using a specific <tt>DatagramPacketFilter</tt>. If such a * <tt>MultiplexedDatagramSocket</tt> does not exist in this instance, it is created. * * @param filter the <tt>DatagramPacketFilter</tt> to get a <tt>MultiplexedDatagramSocket</tt> for * @return a <tt>MultiplexedDatagramSocket</tt> which filters <tt>DatagramPacket</tt>s away from * this <tt>DatagramSocket</tt> using the specified <tt>filter</tt> * @throws SocketException if creating the <tt>MultiplexedDatagramSocket</tt> for the specified * <tt>filter</tt> fails */ public MultiplexedDatagramSocket getSocket(DatagramPacketFilter filter) throws SocketException { if (filter == null) throw new NullPointerException("filter"); synchronized (socketsSyncRoot) { /* * If a socket for the specified filter exists already, do not * create a new one and return the existing. */ for (MultiplexedDatagramSocket socket : sockets) if (filter.equals(socket.getFilter())) return socket; // Create a new socket for the specified filter. MultiplexedDatagramSocket socket = new MultiplexedDatagramSocket(this, filter); // Remember the new socket. int socketCount = sockets.length; if (socketCount == 0) sockets = new MultiplexedDatagramSocket[] {socket}; else { MultiplexedDatagramSocket[] newSockets = new MultiplexedDatagramSocket[socketCount + 1]; System.arraycopy(sockets, 0, newSockets, 0, socketCount); newSockets[socketCount] = socket; sockets = newSockets; } return socket; } }
/** * Adds a <tt>DatagramPacketFilter</tt> which allows dropping <tt>DatagramPacket</tt>s before they * are converted into <tt>RawPacket</tt>s. * * @param datagramPacketFilter the <tt>DatagramPacketFilter</tt> which allows dropping * <tt>DatagramPacket</tt>s before they are converted into <tt>RawPacket</tt>s */ public synchronized void addDatagramPacketFilter(DatagramPacketFilter datagramPacketFilter) { if (datagramPacketFilter == null) throw new NullPointerException("datagramPacketFilter"); if (datagramPacketFilters == null) { datagramPacketFilters = new DatagramPacketFilter[] {datagramPacketFilter}; } else { final int length = datagramPacketFilters.length; for (int i = 0; i < length; i++) if (datagramPacketFilter.equals(datagramPacketFilters[i])) return; DatagramPacketFilter[] newDatagramPacketFilters = new DatagramPacketFilter[length + 1]; System.arraycopy(datagramPacketFilters, 0, newDatagramPacketFilters, 0, length); newDatagramPacketFilters[length] = datagramPacketFilter; datagramPacketFilters = newDatagramPacketFilters; } }