hl1itj / nds-ide

This project is to develop IDE for NintedoDS homebrew software. (Eclipse based IDE with gdb support, RTOS running on Nintendo DS, wifi download + usb download)
17 stars 5 forks source link

TCP Connect to external AP : Between PC-DS Connect by Wifi #1

Open woorinarada opened 12 years ago

woorinarada commented 12 years ago

NDS를 이용한 임베디드 실습을 할 때,

위 작업을 할 경우 NDS와 실습자의 PC간의 연결이 필요한데, NDS에서는 Wifi를 통한 소켓통신을 지원한다.

이 경우 실습자의 PC에서 무선랜을 이용하여 접속하지 않을 경우, 실습자의 PC에서 외부 AP에 접속되어 있는 NDS로의 소켓 접속을 어떻게 하는가의 문제가 생기게 된다.

이를 편리하게 해결할 수 있다면 NDS를 이용한 프로그램 개발시 편이성이 대폭 증대될 것으로 기대된다.

woorinarada commented 12 years ago

TCP 연결을 위해서는 연결 대상의 IP주소와 port번호가 필요하다.

NDS를 AP(공유기)를 통해 인터넷에 접속하는 경우 외부에서 NDS로 접속할 경우 NDS에서 소켓 을 listen()을 이용하여 접속 대기했을때, NDS에서 확인 가능한 정보는

위 두 가지를 확인할 수 있지만

AP 외부에서 접속할 경우 접속하는 PC에서 필요한 정보는

woorinarada commented 12 years ago

AP로 접속 후 AP내부 IP와 내부 port번호를 이용하여 TCP접속하는 방법도 있다. SSID를 활용한다고 한다. 나중에 검색해서 적용시켜 보도록 하자.

woorinarada commented 12 years ago

위에서 언급한 SSID를 이용한 접근 방식은 AP로 접속 후 AP의 내부IP를 이용하여 접근하는 방식을 말한다. 활용방법은 좀 더 알아보아야 할 것 같다.

woorinarada commented 12 years ago

현재 중점적으로 연구하고 있는 방식을 정리하자면

  1. 중계서버(이하 FS)로 파일을 전송할 PC(이하 PC)와 파일을 전송받을 닌텐도DS콘솔(이하 DS)이 connect한다.
  2. PC에서 FS쪽 소켓으로 파일을 전송한다.
  3. FS에서 DS로 파일을 전송한다.

이 방법은 구현에 있어서 큰 문제는 없으며, 기존에 완성되어 있는 TCP를 이용한 PC->DS로 파일을 전송하는 프로그램(Wifidown)을 약간만 수정하면 구현이 가능하다. 단점으로는 서버의 트래픽이 상당히 많이 발생하게 된다.

  1. FS로 PC와 DS가 connect한다.
  2. DS로 접속하는데 필요한 정보를 FS가 PC로 전송한다.
  3. PC에서 DS로 직접 connect한다.

이전 방법에서 언급했던 트래픽 문제를 최소화 하기 위한 아이디어다. 현재 이 방법을 연구하는데 있어서 문제점은 DS로 접근하기 위해서는 DS가 접속되어있는 AP의 IP주소와 AP가 포트포워딩으로 변환한 DS가 listen을 시켜둔 소켓의 포트번호를 알아야 하는데, AP의 IP주소는 서버쪽에서 DS가 connect한 소켓의 정보를 조회하는것으로 얻을 수 있지만, listen을 시켜둔 포트번호를 알아내는 방법을 알지 못하고 있다. listen-connect방향의 전환 역시 PC가 별도의 AP를 통해 접속중인 상태라면 동일한 문제가 발생하게 된다.

이를 일단 보완할만한 방법으로로 제시하는 아이디어는

  1. FS로 PC와 DS가 connect한다.
  2. DS에서는 50000~65535사이의 무작위 port번호를 이용하여 소켓을 listen시킨다.
  3. DS에서 FS로 listen시킨 port번호를 전송한다.
  4. FS에서 PC로 DS가 listen시킨 port번호와 DS가 접속되어 있는 AP의 IP주소를 전송한다.
  5. FS에서 받은 정보를 이용하여 PC에서 DS로 접속한다. 6-1. connect 성공시 파일전송 시작 6-2. connect 실패시 FS를 경유하여 DS로 실패 메세지 전송, 이하 2번으로 루프한다. 중복되는 port번호가 없을 시 포트포워딩으로 포트번호가 바뀌지 않다는 점을 이용한 방법이다. 포트포워딩으로 변환되는 것을 무시하고 AP의 IP주소와 DS에서 listen해둔 port번호를 이용하여 접속할 경우 상당한 확율로 connect가 성공하는 것으로 볼 때 충분히 가능성이 있다고 보여진다. 일반적으로 1024번 이하 포트번호는 시스템에서 선점하는 경우가 많고, 5만번대 이하는 업체에서 사용하는 경우가 있으므로 예시는 5만번대 이상을 제시했지만 임베디드 개발 환경이므로 1025번 이상 port번호 중에서 무작위로 실행할 수도 있을 것이다. 프로세스를 listen대기시켜둔 상태에서 실패 메세지를 받아야 하므로 2개 이상의 프로세스를 동시에 실행시킬 수 있으므로, 이 경우 connect를 DS에서 PC로 하는 방향으로 하는 방법도 생각해볼 문제다. 무작위로 port를 접속-재접속 하게 됨으로, 여려대의 DS가 동시에 사용될 경우, 다른 PC에게서 connect될 우려가 있으므로 connect시 전송자를 확인하는 메세지도 FS를 경유하여 받을 수 있게 해야 할 것이다.
woorinarada commented 12 years ago

UPnP 기술을 응용하면 된다는 조언을 받았습니다. 이후 추가해 보겠습니다. 홀펀칭 기법을 응옹하라는 조언을 받았습니다.

woorinarada commented 12 years ago

master branch/psp-send/psp_msg_loop에 일단 실험코드 작성중인 내용을 업데이트 했습니다. PC1, PC2에서 SV로 connect한 후에 PC2에서 listen을 열어둔 소켓의 port번호를 SV를 거쳐 PC1으로 전송하고 이를 이용해 PC1에서 PC2로 접속하는 방식입니다.(전전 코멘트 에서 두번째 참고) 현재 동기화 문제때문에 작동이 안되는 코드입니다. read했을때 read한 내용을 check해서 필요로 하는 메세지가 올때까지 while 루프를 돌리는 방식으로 동기화를 맞출 예정입니다.

woorinarada commented 12 years ago

master branch/psp-send/ver-SV_CL_OK 실습용 중계서버를 이용한 파일전송 코드가 있습니다. 서버를 켜는곳에 따라 /psp-send/ver-SV_CL_OK/wifidown/source/download.h 위 파일에서 DOWNLOAD_PORT, DOWNLOAD_IP 를 서버프로그램을 작동시킨 PC에 맞게 수정하시고 wifidown 디렉토리에서 make 명령 쳐 주시면 됩니다. 사용법은 서버가 켜진상태에서 -DS에서 wifidown 실행 -DS콘솔에 출력되는 서버의 IP, port를 확인 -client 폴더에 있는 pc 바이너리를 실행 ./pc [파일명] FXD [서버IP] [서버port] 순으로 명령어를 쳐 줍니다. -client쪽 콘솔에서 파일 전송 완료 명령이 나오면 -DS의 A버튼을 눌러주시면 다운로드 완료.

woorinarada commented 12 years ago

현재 서버 프로그램에서 이슈는 두가지가 있습니다.

  1. 좀비프로세스처리 이부분은 서버프로그램 자체를 fork-exec방식으로 실행시켜서 일정시간마다 종료-재실행 을 반복시키는 방식으로 처리할 예정입니다. 재실행시 덤프파일 제거루틴이 적용되지 않은 쓰레기파일을 정리하는 알고리즘도 추가할 예정입니다.
  2. 외부 접속시 bind 에러발생 PC에서 파일 전송 이후 DS에서 접속하기 위해 서버에서 소켓을 bind-listen 하는 과정에서 bind시 에러가 발생합니다. 일괄적으로 발생하는 상황이 아니기 때문에 좀 더 연구해보겠습니다.

처리해야 할 사항이 명확해지면 별도 이슈로 분리하겠습니다.

llewnoiz commented 12 years ago
  1. Ap 를 이용한 통신에서는 홀펀칭 기법을 분석하고 연구하여 방법을 찾아보기
  2. TCP/IP 를 사용하던것을 UDP 로 바꾸어서 사용해볼것