package jpcap; import jpcap.packet.Packet; /** * This class is used to send a packet. */ public class JpcapSender extends JpcapInstance { private native String nativeOpenDevice(String device); private native void nativeSendPacket(Packet packet); private native void nativeCloseDevice(); private native void nativeOpenRawSocket(); private native void nativeSendPacketViaRawSocket(Packet packet); private native void nativeCloseRawSocket(); private static final int RAW_SOCKET_ID = 99999; private JpcapSender() throws java.io.IOException { if(reserveID() < 0) { throw new java.io.IOException("Unable to open a device: " + MAX_NUMBER_OF_INSTANCE + " devices are already opened."); } } JpcapSender(int ID) { this.ID = ID; } /** * Initializes a network interface for sending a packet, and returns an * instance of this class. * * @param device Interface for sending a packet * @return intstance of this class (JpcapSender) * @throws IOException Raised when initialization of the interface failed */ public static JpcapSender openDevice(NetworkInterface device) throws java.io.IOException { JpcapSender sender = new JpcapSender(); String ret = sender.nativeOpenDevice(device.name); if(ret == null) { return sender; } else { throw new java.io.IOException(ret); } } /** * Open a raw IP socket to send a packet.<BR> * When sending a packet via a raw socket, the datalink header of the packet is ignored * (= automatically generated by OS).<P> * Note: the implementation and behavior of a raw socket may vary in different OS. * Also, you can only open one raw socket at a time. * * @return intstance of this class (JpcapSender) * @throws IOException Raised when initialization of the interface failed */ @Deprecated public static JpcapSender openRawSocket() throws java.io.IOException { JpcapSender sender = new JpcapSender(); sender.nativeOpenRawSocket(); sender.ID = RAW_SOCKET_ID; return sender; } /** * Closes the interface. */ public void close() { if(ID == RAW_SOCKET_ID) { nativeCloseRawSocket(); } else { nativeCloseDevice(); } unreserveID(); } /** * Sends a packet. * <p/> * If this JpcapSender instance was created by openDevice(), you need to set * the Datalink layer's header (e.g., Ethernet header) of the packet. <P> * <p/> * If this JpcapSender instance was created by openRawSocket(), you can only * send IP packets, but you may not need to set the Datalink layer's header * of the IP packets you want to send.<BR> * Note: the implementation and behavior of a raw socket may vary in different OS. * For example, in Windows 2000/XP, you need to manually set the datalink/IP headers * of a packet. * * @param packet Packet to be sent */ public void sendPacket(Packet packet) { if(ID == RAW_SOCKET_ID) { nativeSendPacketViaRawSocket(packet); } else { nativeSendPacket(packet); } } }