Задать вопрос
@lenston

Как использовать RAW сокеты в Java?

Необходимо отправить пакет по локальной сети

без создания сервера
без открытия портов
без привязки к IP.

В СИ пакет просто выплевывался в сеть, а клиент знал что ему принимать, а что отбрасывать..
В Java RAW не поддерживается..
Как отправить такой пакет??

Я хотел использовать UDP, но там привязано к порту..
  • Вопрос задан
  • 4213 просмотров
Подписаться Оценить Комментировать
Решения вопроса 1
@asd111
Ищите java обертку для libpcap - библиотека для работы с raw пакетами по сети.
вроде вот эта должна подойти
jnetpcap.com

пример отправки своего пакета
package org.jnetpcap.examples;

import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.jnetpcap.Pcap;
import org.jnetpcap.PcapIf;

public class PcapSendPacketExample {
  public static void main(String[] args) {
    List<PcapIf> alldevs = new ArrayList<PcapIf>(); // Will be filled with NICs
    StringBuilder errbuf = new StringBuilder(); // For any error msgs

    /***************************************************************************
     * First get a list of devices on this system
     **************************************************************************/
    int r = Pcap.findAllDevs(alldevs, errbuf);
    if (r == Pcap.NOT_OK || alldevs.isEmpty()) {
      System.err.printf("Can't read list of devices, error is %s", errbuf.toString());
      return;
    }
    PcapIf device = alldevs.get(0); // We know we have atleast 1 device

    /*****************************************
     * Second we open a network interface
     *****************************************/
    int snaplen = 64 * 1024; // Capture all packets, no trucation
    int flags = Pcap.MODE_PROMISCUOUS; // capture all packets
    int timeout = 10 * 1000; // 10 seconds in millis
    Pcap pcap = Pcap.openLive(device.getName(), snaplen, flags, timeout, errbuf);


    /*******************************************************
     * Third we create our crude packet we will transmit out
     * This creates a broadcast packet
     *******************************************************/
    byte[] a = new byte[14];
    Arrays.fill(a, (byte) 0xff);
    ByteBuffer b = ByteBuffer.wrap(a);

    /*******************************************************
     * Fourth We send our packet off using open device
     *******************************************************/
    if (pcap.sendPacket(b) != Pcap.OK) {
      System.err.println(pcap.getErr());
    }

    /********************************************************
     * Lastly we close
     ********************************************************/
    pcap.close();
  }
}


На указанном сайте есть ещё примеры в разделе documentation examples думаю разберетесь
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Как вы себе представляете отправку пакета без открытия портов ?! Куда его отправлять то ? И при чем тут RAW сокеты ?
Ответ написан
@lenston Автор вопроса
в Си делал вот так..

data[]=//заполнял данные
int sock=socket(PF_PACKET,SOCK_RAW,htons(ETH_P_802_3));
send(sock,data,PACKET_LENGTH,0);


а клиент слушал все, что происходило в сети..
и, в зависимости от данных, отклонял или принимал пакет..

нужно повторить что-то похожее на Java
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы