boost asio를 이용한 iptuner 제작

Program Lang./C++ 2017. 4. 11. 20:23

1. 목적

boost asio를 몇 번을 봤는데, 볼 때마다 기억이 잘 나지 않는다. boost asio 예제를 하나 만들면 기억에 도움이 되지 않을까 하는 마음으로 작성한다. 예제는 내 Job과 관련이 있는 부분인 IPTV의 한 부분인 간단한 IPTuner를 만들어 본다.

IPTuner는 일반적으로 Multicast Stream을 수신하는 부분으로 간단한 예제이지만 큰 틀은 변하지 않는다.


boost buffer 부분은 좀 더 공부를 해야 할 듯 하다.


2. 소스코드

windsend나 VLC를 이용해서 server는 대체한다. 다만 VLC는 TS Stream를 VLC 맞게 변경하는 부분이 있어서 정확한 값을 얻기는 힘들다. 일단 windsend를 기반으로 동작 테스트를 진행한다. 


전에 올렸던 소스가 CTRL-C를 누르지 않으면 종료되지 않은 문제가 있어서 수정해서 다시 올린다. 전에 CTRL-C를 누르지 않으면 종료하지 않는 이유는 io_service에서 run을 호출하는 thread에서 block되기 때문에 그 thread가 main함수가 돌고 있는 thread여서 동작하지 않았다. 따라서 실제 socket에서 receive 동작을 하는 io_service 동작은 별도의 thread로 분리한다.


소스상에서 한가지 동작 중에 문제가 있는 부분은 io_service work에 관한 것이다. 실제 work는 io_service가 stop을 호출하지 전까지 io_service에 계속 block되어져야 하는데 block되지 않고 종료되는 문제가 있다. 계속 삽질 중이지만 생각되로 동작하지 않는 문제가 있다. 여기까지 오는데 엄청난 삽질을 해 됐다. 몇 가지 문제 빼 놓고는 정상적으로 동작하는 것으로 보인다.



3. 실행 결과

몇가지 스트림을 테스트 해 봤는데 값은 정상적으로 얻어온다.



: