- 浏览: 182391 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
行动与思考:
你好!请问GraphicString这个类型是什么类型呀?怎么 ...
ACSE-1 (osi 8650-1)abstract syntax -
gaozon:
楼主,你好,请问用lua能编写这样一种插件吗:我想更改网络层i ...
编程语言 Lua -
langzhe:
percept:profile("test.dat& ...
erlang r12 新增加Percept并发性能调测模块 -
mryufeng:
解释epmd等2进制协议是erlang的拿手呀
Use Erlang NIF to snoop, capture packets(in Windows XP), in OTP-R13B04 -
xumingyong:
GeoffCant在git clone git://git.e ...
Use Erlang NIF to snoop, capture packets(in Windows XP), in OTP-R13B04
1. Overview
In my last blog topic, I realize a network sniffer in Ubuntu, here I rewrite the code in Windows XP, and add a new function to find all network adapter.
2. Developing enviroment
- windows xp
- minGW 5.1.6
- gcc 3.4.5
- winPcap 4.1.1
- Erlang/OTP R13B03
3. nif.erl
%%% nif sniffer -module(nif). -on_load(on_load/0). -export([lookup/0, opendevice/1, capture/0, loop/1]). on_load() -> ok = erlang:load_nif("./nif", 0), true. lookup() -> error. opendevice(_Interface) -> error. capture() -> error. loop(0) -> ok; loop(Count) -> Pkt = capture(), io:format("~p~n", [Pkt]), loop(Count-1).
4. nif.h
#include "erl_nif.h" #include "stdio.h" #include "pcap.h" #include "string.h" #include "ctype.h" #ifndef NIF_H #define NIF_H #ifdef __cplusplus extern "C" { #endif static ERL_NIF_TERM opendevice(ErlNifEnv* env, ERL_NIF_TERM device); static ERL_NIF_TERM capture(ErlNifEnv* env); static ERL_NIF_TERM lookup(ErlNifEnv* env); #ifdef __cplusplus } #endif #endif
5. nif.c
/* This file used to create a Erlang NIF which sniffer network packets. */ #include "nif.h" pcap_t *devHandler = NULL; static int my_enif_get_string(ErlNifEnv *env, ERL_NIF_TERM list, char* buf) { ERL_NIF_TERM cell, head, tail; int val; while (enif_get_list_cell(env, list, &head, &tail)) { if (!enif_get_int(env, head, &val)) return 1; *buf = (char)val; buf++; list = tail; } *buf = '\0'; return 0; } static ERL_NIF_TERM lookup(ErlNifEnv* env) { int i = 0; char errbuf[PCAP_ERRBUF_SIZE], str[1024]; pcap_if_t *alldevs; pcap_if_t *d; if (pcap_findalldevs_ex("rpcap://", NULL /* auth is not needed */, &alldevs, errbuf) == -1) return enif_make_string(env, errbuf); for(d= alldevs; d != NULL; d= d->next) { strcat(str, d->name); strcat(str, "|||"); /* strcat(str, "\t\t"); if (d->description) strcat(str, d->description); else strcat(str,"\n"); */ } pcap_freealldevs(alldevs); return enif_make_string(env, str); } static ERL_NIF_TERM opendevice(ErlNifEnv* env, ERL_NIF_TERM device) { char dev[64]; char errbuf[PCAP_ERRBUF_SIZE]; //memset(errbuf, 0, PCAP_ERRBUF_SIZE); my_enif_get_string(env, device, dev); /* return enif_make_string(env, dev); */ /* Parms: dev,snaplen,promisc,timeout_ms,errbuf * to_ms=0 means wait enough packet to arrive. */ devHandler = pcap_open_live(dev, 65535, 1, 0, errbuf); if(devHandler != NULL) return enif_make_atom(env, "ok"); else return enif_make_string(env, errbuf); } static ERL_NIF_TERM capture(ErlNifEnv* env) { int i; struct pcap_pkthdr pkthdr; const u_char *packet = NULL; ErlNifBinary bin; packet = pcap_next(devHandler, &pkthdr); if(packet != NULL) { enif_alloc_binary(env, pkthdr.len, &bin); for(i = 0; i < pkthdr.len; i++) { bin.data[i] = packet[i]; } } else { bin.size = sizeof("NULL"); bin.data = "NULL"; } return enif_make_binary(env, &bin); } static ErlNifFunc nif_funcs[] = { {"lookup", 0, lookup}, {"capture", 0, capture}, {"opendevice", 1, opendevice} }; ERL_NIF_INIT(nif,nif_funcs,NULL,NULL,NULL,NULL)
6. Build the code
- Insatll minGW, and re-set %PATH%, %C_INCLUDE_PATH%, %LIBRARY_PATH%.
- Copy the ERTS WinPcap include and lib folder to minGW folder.
- Copy wpcap.lib to source folder.
- in windows [cmd] enviroment, execute following
gcc -shared -o nif.dll nif.c wpcap.lib
7. Test the code
Erlang R13B03 (erts-5.7.4) [smp:2:2] [rq:2] [async-threads:0] Eshell V5.7.4 (abort with ^G) (first@ETxumingyong)1> cd("sniffer_nif/win32"). D:/workspace/sniffer_nif/win32 ok (first@ETxumingyong)2> c(nif). {ok,nif} (first@ETxumingyong)3> nif:lookup(). "rpcap://\\Device\\NPF_GenericDialupAdapter||| rpcap://\\Device\\NPF_{CB6CFA59-46DE-4172-BBB1-85C85E654848} |||rpcap://\\Device\\NPF_{B9A5FCD5-1424-4F42-B680-E73A89CFF638}|||" (first@ETxumingyong)4> nif:opendevice("rpcap://\\Device\\NPF_{CB6CFA59-46DE-4172-BBB1-85C85E654848}"). ok -------------------------------------------------------------- <<255,255,255,255,255,255,0,27,185,223,71,97,8,0,69,0,0,78,188,123,0,0,128,17, 13,12,10,184,45,169,10,184,45,255,0,137,0,137,0,58,111,159,134,52,1,16,0,1,0, 0,0,0,0,0,32,69,75,69,74,69,66,69,79,69,76,69,80,69,79,69,72,69,67,69,66,69, 79,67,65,67,65,67,65,67,65,67,65,0,0,32,0,1>> <<255,255,255,255,255,255,0,35,77,220,61,143,8,0,69,0,0,78,19,248,0,0,64,17, 245,76,10,184,45,236,10,184,45,255,0,137,0,137,0,58,191,137,128,20,1,16,0,1, 0,0,0,0,0,0,32,69,70,69,73,70,65,70,65,67,65,67,65,67,65,67,65,67,65,67,65, 67,65,67,65,67,65,67,65,67,65,66,76,0,0,32,0,1>> <<1,128,194,0,0,0,0,2,125,41,137,65,0,38,66,66,3,0,0,0,0,0,128,0,0,2,125,41, 137,64,0,0,0,0,128,0,0,2,125,41,137,64,10,13,0,0,20,0,2,0,15,0,0,0,0,0,0,0,0, 0>> <<255,255,255,255,255,255,0,35,84,32,248,213,8,6,0,1,8,0,6,4,0,1,0,35,84,32, 248,213,10,184,45,230,0,0,0,0,0,0,10,184,45,136,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0>> 。。。
8. Note
- I tried the visuall c++ 6.0, failed, the cl tool are so old.
- After call [nif:lookup() ] function, there are 3 net adapter with register style output, very strange.
发表评论
-
又一本ERLANG书:Erlang and OTP in Action
2010-03-30 15:46 1195在网上找了很久,终于通过twitter-->> ... -
Use Erlang NIF to snoop, capture packets(in Windows XP), in OTP-R13B04
2010-02-26 21:45 18031. 介绍 在上一篇博文http://xumingyo ... -
使用一个Makefile文件同时编译dll和beam文件
2010-02-09 11:28 15481. 测试环境 - Windows XP SP3 ... -
Use Erlang NIF to snoop, capture packets.
2010-02-01 17:43 25651. Overview In Erlang/OT ... -
New features of NIF in Erlang/OTP R13B04
2010-01-31 15:34 1108From: http://archive.netbsd.se/ ... -
Another erlang nif test
2010-01-31 11:30 1261from http://www.davispj.com/200 ... -
转载:UBUNTU下安装Erlang的两种方法
2010-01-28 21:04 2405================第一种============ ... -
在SOLARIS x86下编译安装ERLANG的另一种方法(失败)
2010-01-04 12:48 1058尝试另一种方法。 1. 安装环境 ... -
在SOLARIS x86下成功编译安装ERLANG
2009-12-25 22:35 10401. 系统环境 在http://www.sunfr ... -
ERLANG编辑环境IDE配置
2009-11-18 08:41 37081. 概述 erlang的IDE有很多种,包括EMACS, ... -
Erlang文件I/O性能测评
2009-08-23 15:31 1398转载:http://chaoslawful.ite ... -
erlang网络编程的几个性能调优和注意点
2009-08-23 10:38 1220转载:http://www.lupaworld.com/act ... -
用Erlang实现领域特定语言
2009-08-13 13:13 1005用Erlang实现领域特定语言 http://cools ... -
ERLANG mnesia:create_table/2问题
2009-06-11 14:27 1280我测试发现mnesia:create_table()有这样几个 ... -
ERLANG的OS_MON应用程序
2009-06-10 23:03 1657在ERLANG在线手册中,凡是看到〔Application〕字 ... -
erlang/OTP for TCP资源
2009-05-24 00:02 1131a-generalized-tcp-server ... -
ERLANG网上的资源
2009-04-29 15:05 1099http://www.erlang.org/ 是官方 ... -
erlang:split_binary(Bin, N)的BUG
2009-04-23 23:52 5093OS运行平台: root ... -
当你net_adm:ping(Node)的时候发生了什么?流程复杂 但是对理解dist工作原理至关重
2009-04-09 16:31 1437当你net_adm:ping(Node)的时候发生 ... -
erlang的crash_core_dump解读
2009-04-09 16:27 2006正常情况下 当erlang进程发生错误没有catch的时候 e ...
相关推荐
【标题】:“rustler编写erlang nif” 在Erlang生态系统中,Native Implemented Functions (NIFs) 是一种机制,允许开发者用其他语言(如C、C++或Rust)编写性能关键部分的代码,然后在Erlang虚拟机(VM)中调用。...
Erlang NIF(Native Implemented Functions)是Erlang虚拟机提供的一种机制,允许开发者用C语言或者其他低级语言编写性能关键部分的代码,并在Erlang系统中无缝调用。这种方式可以充分利用C语言的高效性,同时保持...
在Erlang中,`NIF (Native Implemented Functions)` 是一种机制,允许开发者使用其他语言(如C或Rust)编写高效性能的代码,并在Erlang虚拟机中调用。本篇主要介绍如何利用Rust语言来开发Erlang NIF,并探讨`erl_nif...
Windows下使用NIF扩展Erlang完整例子,包含nif工程项目,erlang引用例子。 配套文章:http://blog.csdn.net/mycwq/article/details/17527485
示例Rustler是一个用于以安全的Rust代码编写Erlang NIF的库。 这意味着应该没有任何办法。 入门指南 示例Rustler是一个用于以安全的Rust代码编写Erlang NIF的库。 这意味着应该没有办法使BEAM(Erlang VM)崩溃。 该...
OpenSSL 3 support in Erlang is considered to be mature and ready for production use. Erlang 26.1 and later versions supports FIPS mode on OpenSSL 3 3.12.13 3.12.12 3.12.11 3.12.10 25.0 26.2.x The ...
Erlang的windows版本Erlang的windows版本Erlang的windows版本Erlang的windows版本Erlang的windows版本Erlang的windows版本Erlang的windows版本Erlang的windows版本Erlang的windows版本Erlang的windows版本Erlang的...
ErlPuzzle - Erlang 的 libpuzzle NIF Puzzle 库旨在快速找到视觉上相似的图像(gif、png、jpg),即使它们已被调整大小、重新压缩、重新着色或稍微修改。 该库是免费的、轻量级的但非常快速、可配置、易于使用,...
在Erlang中,为了实现与C或其他低级语言的高效交互,Erlang提供了一个名为`erl_nif`的接口。本文将深入探讨`erl_nif`,了解它是如何扩展Erlang的功能,并讨论如何使用它来提升性能。 `erl_nif`(Erlang NIF,Native...
Erlang的25.0版本是该语言的一个更新,针对Windows操作系统进行了优化。 在Windows环境下安装Erlang 25.0,你需要下载提供的文件`otp_win64_25.0.exe`。这是一个Windows 64位的可执行安装程序,包含了所有必要的...
标题中提到的“XP能用的erlang+rabbitMQ版本”指的是这两个软件在Windows XP操作系统上兼容的特定版本。Windows XP虽然是一款较老的操作系统,但仍有用户在使用,因此确保软件在该平台上的运行能力很重要。otp_win32...
Rust 中的 Erlang NIF 这是一个如何在 Rust 中实现 NIF 的示例。 它对我有用,也可能对你有用,但如果它吃掉了你的作业,请不要生气。 虽然这将是可行的写现实世界的代码下面这个例子,因为整个erl_nif.h接口可用...
在标题"erlang23.2版windows64位.zip"中,我们了解到这是Erlang的一个特定版本——23.2,专为Windows 64位操作系统设计的安装包。这个版本可能包含了对Windows平台的优化,以确保在该系统上高效运行。 描述中的...
sqlite3的Erlang nif库。 介绍 该库允许您使用来自erlang的出色的sqlite引擎。 该库以nif库的形式实现,可以最快地访问sqlite数据库。 这可能是有风险的,因为nif库或sqlite数据库中的错误可能会使整个Erlang VM...
盗贼文档|入门|例子Rustler 是一个用安全的 Rust 代码编写 Erlang NIF 的库。这意味着应该没有办法让 BEAM (Erlang VM) 崩溃。该库提供了用于生成与 BEAM 交互的样板的工具,处理 Erlang 术语的编码和解码,并在它们...
Rustler是一个关键工具,它允许开发人员使用Rust语言安全地构建Erlang的Native Interface (NIF)函数。NIF是Erlang虚拟机(VM)提供的一种机制,使得Erlang代码能够调用C或C++编写的库,从而利用这些语言的高性能特性...
wpi - 用于 Raspberry Pi 的 WiringPi 库的 Erlang NIF 此应用程序是围绕库的 Erlang 包装器,该库是 Arduino 的 Wiring 库的 Raspberry Pi 方言。 wpi 使得读取和写入 GPIO 引脚、写入 LCD、移入和移出位或通过...
**Erlang NIF(Native Implemented Functions) 是Erlang编程语言中的一种机制,它允许开发者集成用其他语言(如C、C++等)编写的代码,以提高性能或利用Erlang VM(虚拟机)不支持的功能。NIFs在Erlang中的主要目的是...
本压缩包提供的是适用于Windows操作系统的Erlang 25.2.3和RabbitMQ Server 3.11.9的下载资源,非常适合个人学习使用。 Erlang是一种函数式编程语言,由瑞典电信设备制造商Ericsson为构建高可用、容错性强的实时系统...