Каким будет самый простой способ отправлять и получать необработанные сетевые пакеты. Должен ли я писать свою собственную оболочку JNI для некоторого c API, и в этом случае какой API я ищу?
Обновлено: я хочу иметь возможность делать то, что делает wirehark, то есть записывать все входящие пакеты на интерфейсе и, кроме того, иметь возможность отправлять обратно свои собственные созданные пакеты. И я хочу сделать это на Mac.




TINI - это Java-контроллер Ethernet, который может иметь библиотеки и классы для прямого доступа к данным из кадров Ethernet в потоки TCP. Возможно, вы сможете найти там что-то, что реализует ваши необходимые классы. В противном случае должны быть указатели или группы пользователей, которые дадут вам фору.
Если вы начнете с идеи, что вам нужно что-то подобно в виде сниффера пакетов, вы захотите взглянуть на http://netresearch.ics.uci.edu/kfujii/jpcap/doc/.
Raw Socket для Java - это запрос на JDK в течение длительного времени. См. Запрос здесь. Там долгое обсуждение, в котором вы можете найти обходные пути и решения. Однажды мне это понадобилось для простой операции PING, но я не могу вспомнить, как я решил это. Извини :)
На данный момент мне лучше всего подходит БНФ api и написать тонкую оболочку JNI.
Вы не можете получить доступ к необработанным сокетам из чистой Java, поэтому вам понадобится какой-то слой между вашим кодом Java и сетевыми интерфейсами.
Также обратите внимание, что доступ к необработанным сокетам обычно доступен только «корневым» процессам, поскольку в противном случае любой пользователь мог бы а) прослушивать весь трафик и б) генерировать поддельные пакеты.
Вместо того, чтобы писать всю свою программу так, чтобы она запускалась от имени «root», вы можете подумать о том, чтобы захват и генерация пакетов выполнялись в отдельной программе с каким-либо IPC (RMI, именованный канал, TCP-сокет и т. д.) Для обмена данные с вашим приложением Java.
@Pacerier по определению не может быть независимым от платформы, хотя есть библиотеки, которые знают о платформе и скрывают от вас эти зависимости.
почему по определению он не может быть независимым от платформы?
@Pacerier, потому что каждая платформа имеет разные API для доступа к необработанным сокетам.
На каждой платформе есть разные способы выполнения даже большинства вещей, связанных с базовый. Это не значит, что он не может быть независимым от платформы. Я бы сказал, что Java не предоставляет для него платформенно-независимый интерфейс.
Какие-либо независимые от платформы решения?