Unix Domain Socket
Unix에서 프로세스간 통신(IPC)를 위해 사용하는 것으로 동일 커널의 프로세스간 통신을 위해 파일을 사용한다.
통신 방식은 기존 네트워크에서 프로그램의 소켓과 옵션을 제외하고 거의 동일하게 사용한다고 한다.
뭐 대단할 건 없지만 전혀 몰랐던 부분으로 하나 제대로 배웠다.
근데 NFS 상 파일을 두고 Unix Domain Socket을 사용할 수 있을까?
만일 그렇게 된다면 NFS로 연결된 시스템간 또 다른 방화벽 정책 적용없이 네트워킹이 되는 것으로 다양하게(?) 활용할 수 있을 것 같다.
조만간 집에 있는 PC로 확인해봐야겠다.
about airmaster
2014년 2월 4일 화요일
2014년 2월 2일 일요일
usbmuxd에 관하여..
처음 접한 프로그래밍 언어는 C였다. 하지만 C는 나에게 너무 어려웠다.
2년 정도의 시간이 흐른 후 자바를 접할 때에는 보다 쉬운 접근이 가능했다.
- 자료구조가 충분치 않고 (C++ STL이 있다는건 몰랐다)
- 큰 프로그램을 만들기 위한 방법을 찾지 못했고, (터보 C로 프로그래밍을 하는 건...)
- 문법은 어렵지 않았으나 포인터를 사용하는 코드는 이해하기 어려웠고,
- 전처리 문법을 사용하는 부분에서는 왜? 사용하는지 이해하지 못했다.
2년 정도의 시간이 흐른 후 자바를 접할 때에는 보다 쉬운 접근이 가능했다.
- 자료구조가 충분하고,
- Eclipse를 이용하여 여러 클래스(파일)를 통합 개발환경을 이용해서 동시에 개발하며,
- 포인터가 없으며(명시적인 문법으로),
- 모든 시스템에서 동일한 코드로 동작하므로.
비록 객체지향에 대한 부족한 이해는 자바를 자유자재로 사용하기 위한 큰 산이었지만 그건 시간이 해결해 주었다.
그러다 iPhone이 나오고 한참이 흘러 iPhone에 앱을 만들어 돌려보고 싶었고 무작정 iMac을 구입해서 공부하기 시작했다.
그렇게 접한 Objective-C는 놀라운 언어였다.
- 기존 C, C++ 코드를 그대로 사용할 수 있고,
- 무엇보다 스크립트 언어 만큼이나 동적인 언어(라이브러리에 메소드 추가 등)였으며,
- 배우기 쉽고, 사용하기 쉬웠다. (정말 단기간에 제대로 사용할 수 있었다.)
특히 기존에는 상상할 수 없었던 selector를 활용한 동적인 성격 Objective-C의 특성은 실제 업으로 ios 개발을 하면 할수록 감탄하게 된다. (iOS의 버전업과 관련해서 특히...)
그렇게 iOS 개발자의 길에 입문하게 되었다.
최근 iOS에서 PC로 주기적으로 정보를 전송해야 하는 문제가 발생했다.
문제 접근 및 해결 방안
1. TCP/IP를 이용
2. USB연결을 이용
각 해결방안에 대한 평가
1. tcp/ip를 이용한 통신을 위해서는
- server의 ip가 공인 ip이거나, 동일 네트워크(공유기)에 연결되어야 함
- 공인 ip를 사용하는 pc는 거의 없으며, 공유기 등을 이용한 사설 네트워크는 기업환경에서 보안 정책으로 제한되는 경우가 많음
2. USB 연결은 USB 케이블이 있어야 한다는 문제가 있으며, tcp/ip에 비해 개발해야 할 것이 많고 어렵다는 문제점이 있다.
=> 비록 USB 케이블이 있어야 한다는 문제점이 있으나, USB 케이블만 있으면 다른 제약이 없기 때문에 비록 개발 난이도가 있다고는 해도 이 방법로 개발을 하기로 결정했다.
그렇게 ios와 pc와의 usb 통신을 위해 자료를 검색하는 도중 usbmuxd를 찾았다.
usbmuxd는 iTunes를 설치할 경우 동작하는 데몬으로, pc내 프로세스와 usb에 연결된 iOS의 통신을 중계한다.
Kim-ui-MacBook-Air:~ mobile$ ps -ef | grep usbmuxd
213 64 1 0 금05PM ?? 0:27.98 /System/Library/PrivateFrameworks/MobileDevice.framework/Versions/A/Resources/usbmuxd -launchd
501 35424 32974 0 8:41PM ttys001 0:00.00 grep usbmuxd
Kim-ui-MacBook-Air:~ mobile$
MobileDevice.framework가 iTunes와 같이 설치되는 framework이다.
usbmuxd 통신 중계 방식 (참고 http://theiphonewiki.com/wiki/Usbmux)
- usbmuxd 데몬은 Unix Domain Socket(/var/run/usbmuxd)을 이용하여 pc내 다른 프로세스와 통신한다.
- usbmuxd 데몬은 usb케이블과 연결된 ios 앱과 tcp/ip 통신을 한다.
- usbmuxd는 pc 프로세스와 Unix Domain Socket 통신, ios 앱과 tcp/ip 통신을 중계하는 중계 데몬이다.
- pc내 프로세스는 Unix Domain Socket 통신을, ios내 앱은 tcp/ip 통신을 구현하면 usbmuxd가 둘 사이의 통신을 연결한다.
- 통신 프로토콜은 미리 정해둔 binary 방식과, plist를 이용한 lockdown 프로토콜 방식이 있다.
Unix Domain Socket의 경우 Unix 및 Linux 계열에만 존재하며 Java에서는 특정버전이상에서만 지원(java nio 에서 지원된다는 것은 읽었지만 미확인)한다.
Target PC 프로세스는 java로 jni를 이용해서 개발하기로 결정함
Window에서는 Unix Domain Socket이 지원되지 않고 iTunes를 설치한 경우 27015 포트에 usbmuxd가 Socket Listen하고 있으며 pc 프로세스가 27015 포트로 연결되면 usbmuxd는 usb 케이블로 연결된 ios 앱과 tcp/ip 연결을 중계한다.
이와 관련된 python 코드가 있다. http://cgit.sukimashita.com/usbmuxd.git/
앞으로 ...
JNI는 다른 사람이 개발한 코드를 읽은 적은 있었지만 직접 개발한 건 이번이 처음이었다. 관련하여 정리할 필요가 있다. (1)
통신과 관련하여 SNA, TCP/IP, UDP, L4등 장비, 프로토콜과 관련해서 왠만한 건 다 경험해 봤다고 생각했었다. 하지만 Unix Domain Socket은 처음 들어봤고 이와 관련해서 많이 부족하다고 생각했다. 결국 소켓 API를 사용하면서 옵션에 대해 자세히 보지 않았던 문제점이 드러난 것이다. 따라서 Unix Domain Socket을 포함한 소켓 옵션에 대해 자세히 알아봐야 한다.(2)
Python은 공부만하고 실제 간단한 모니터링 스크립트를 작성하는 것 외에는 사용한 적이 없었다. python을 이용한 재미난 프로그램을 만들어봐야 겠다.(3)
피드 구독하기:
글 (Atom)