무슨 바람이 들었는지 libpcap 가지고 놀았다.
캘리포니아대에서 만든 jpcap을 사용했다.
소스포지에 도는 jpcap.sourceforge.net 도 있긴한데 서로 이름만 같고 별 비슷한 점은 없다 -_-
구글에서 libpcap java 로 검색하면 uci.edu 것이 가장 먼저 나오는데, jpcap 만으로 검색하면 소스포지의 것이 나온다. uci.edu의 jpcap faq에 다음과 같은 항목도 있다.
Q: Is this Jpcap related to the Jpcap on sourceforge? A: No. They are independently developed, and thus are totally different products.
브라보~ ![]()
아무튼 이 jpcap을 잘 가지고 놀다가.. 이녀석이 날 1시간 정도 삽질하게 만들었다. 이유인 즉슨... 패킷 캡춰 및 필터링을 잘 하다가 아주 가끔씩!!!
#
# An unexpected error has been detected by HotSpot Virtual Machine:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6d75c5cc, pid=58640, tid=58616
#
# Java VM: Java HotSpot(TM) Client VM (1.5.0_08-b03 mixed mode, sharing)
# Problematic frame:
# V [jvm.dll+0x9c5cc]
#
# An error report file with more information is saved as hs_err_pid58640.log
어우 이런거 싫어 싫어~ -_- 상세 로그 파일을 보면
Stack: [0x00030000,0x00070000), sp=0x0006f9a8, free space=254k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
V [jvm.dll+0x9c5cc]
Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j jpcap.JpcapCaptor.loopPacket(ILjpcap/PacketReceiver; )I+0
j XXXXXXX.main([Ljava/lang/String; )V+40
v ~StubRoutines::call_stub
loopPacket은 native 메서드다. 한숨 쉬며 Visual Studio 띄운다 (씨익)
Debug Build 하여 Attach 해봐야 마지막에 죽은게 jvm.dll 이니 날로 먹기는 글렀고.. 분명 winpcap에 에러가 있을리 없으니 jpcap의 jni + c 코드 문제라고 확신하고 디깅하다가 쌩뚱맞은 코드 발견
void dispatcher_handler(u_char *id,const struct pcap_pkthdr *header,
const u_char *data)
{
jobject packet;
int ID=(int)id;
JNIEnv *env=jni_envs[ID];
get_packet(*header,(u_char *)data,&packet,ID);
(*env)->CallVoidMethod(env,jpcap_handlers[ID],<b>handleMID</b>,packet);
DeleteLocalRef(packet);
YIELD();
}
pcap_dispatch에 핸들러에서 Java 쪽 인터페이스를 부르길래 자바쪽 callee 인터페이스 handleMID를 살펴보니
public void receivePacket(Packet packet);
아.. 이런.. --; 자바쪽 리스너에서 익셉 떨어지면 다 무시하잖아! 게다가 익셉 처리하는 caller는 pcap_dispatcher 고
그렇다.
아주 가끔 썰렁한 RuntimeException 새끼들이 발생한거였는데 이를 잡아주지 않아 위로 위로 올라가서 죽은것이 분명하리라. 자바쪽에서 private 메서드로 한 번 더 감싸고 try catch 하여 예외처리용 핸들러로 예외를 던져버리게 하니 무리없이 돌아간다.
Visual Studio 띄울때만 해도 이렇게 끝날줄은 몰랐다. ![]()
아무튼 만들려던 툴을 완성하여
하고자 하던 일을 이것저것 하면서 스스로 (씨익) 하고 있다.
그다지 떳떳한 용도의 어플리케이션이 아니므로 공개는 안할 계획이다. ![]()
몇년전부터 libpcap 가지고 뭐 만들면 재밌겠다.. 생각만 하고 미루던 건데 이렇게 해치우고 나니 후련하고 좋다!
P.S.: 원저자에게 보고 해줄까?
Comments
3 thoughts shared
rath
해줘야겠네요~ 지금 하던거 끝나면요 ㅎㅎ 종현님 여전히 잘 지내시지요?
rath
오래 사용하다보니.. 그것 말고도 문제가 꽤 있네요 ;ㅁ; 아아 밉다 밉다~
Continue Reading
Discover more thoughts and insights
요새 하루를 시작하는 루틴
자고 일어나면 로디올라 한 알을 먹고, 물을 마시고, 씻고, 밥을 준비한다. 밥을 먹으면서 루모시티 한 바퀴를 돌고, 멀티비타민을 먹는다. 에스프레소를 내린 뒤 간단히 양치하고 방에 들어가 에스프레소를 2/3 정도
가을이 되니 기분이 좋다
단지 날씨가 좋아 기분이 좋은것인지는 모르겠지만! (나는 여름을 대단히 싫어한다) 요새는 하는 일들도 재미있고, 사람들한테 화를 내는 일도 거의 없고 사람들이 도에 맞지 않는 일을 부탁해도 웃으며 처리해주는 나쁜
나는 내가 낯설다 - 끄적임 4
내가 모르는 나, 99%를 찾는 심리여행 나는 내가 낯설다. 부글 Books 출판사에서 나왔고 티모시 윌슨이 지은 이 책은 얼마전 예스24 뉴스레터를 받고 제목에 낚여서 바로 구입한 책이다. 맞다. 나는 내가