이더넷 송수신 프로그램 작성

Cute_Security15·2025년 5월 25일

linux dev

목록 보기
15/16

상황

리눅스 보드에서 계산된 체적값을 윈도우 PC 로 전송하는 프로그램이 필요하다

체적값은 이더넷 케이블을 통해 전달되고, PC 에서는 이 데이터가 넘어오는것을
START/STOP 할수 있는 버튼이 필요하다.

또한 데이터가 넘어올때 수신완료에 걸리는 시간과 FPS 의 측정이 필요하다

확인한 내용

전략

linux 의 경우 BSD socket 을 사용하고, 윈도우 에서는 winsock 과 mfc 의 cscoket 이 있다.

소켓 끊고 맺는 과정에서 2개의 다른 인터페이스를 쓰면, 작성에 필요한 배경지식도 2배가 되고,
나중에 다른이가 확장하거나 수정할때도 부담이 될것이라 판단.

두 플랫폼에서 공통적으로 쓸수 있는 socket 이 있는지 확인

--> boost::asio 소켓을 사용하는 방향으로 진행

데이터

전달해야 하는 데이터는 다음과 같다.

timestamp string (100)
체적 string (100)
point cloud 데이터 (640 x 480 x 2)

START/STOP 은 버튼을 누를떄만 접속한다. 명령을 보내고나면 연결을 종료한다.

전달해야 하는 명령은 다음과 같다.

command id (4)
command argument vector

패킷조립 로직

tcp port 20000 (데이터 전달)

PC 는 접속을 대기하는 서버 (acceptor) 를 열어두고, 보드에서 클라이언트를
실행하면 접속시도를 한다.

클라이언트는 데이터 구조체를 serialize 해서 전달하고, 서버는 받은 데이터를
deserialize 해서 구조체를 재구성한다.

데이터를 보낼때는 serialize 된 payload 와 payload_size 를 한번에 전달하고,
tcp framing 을 적용한다.

따라서 데이터의 실제 모양은 다음과 같다

payload_size (4bytes)
payload

payload 의 실제 모양은 다음과 같다

timestamp string size (4bytes)
timestamp string
체적 string size (4bytes)
체적 string
point cloud 데이터 size (4bytes)
point cloud 데이터

데이터를 받을때는 커널로부터 1024 bytes 씩 읽어서 데이터를 이어붙인후
deserialize 를 시도한다. deserialize 가 성공할때까지 반복한다.

tcp port 20001 (명령 전달)

  • tcp port 20000 과 서버/클라이언트 역활이 반대가 된다
  • 20000 과 동일하게 tcp framing 을 적용한다.

따라서 데이터의 실제 모양은 다음과 같다

payload_size (4bytes)
payload

payload 의 실제 모양은 다음과 같다

command id size (4bytes)
command id
command argument vector size (4bytes)
command argument vector

작성하면서 알게 된 내용

클라이언트에서 write(), shutdown() 를 쓸때, 서버가 종료된 상태면
exception 이 발생할수 있으므로 try catch 로 감싸야 한다.

클라이언트에서 connect() 를 쓸때, 접속할 서버가 없으면 block 된다.
따라서 async_connect() 와 steady_timer 를 사용해 일정시간이 흐른후에
접속 성공유무를 체크한다.

접속하는 클라이언트가 없다면, 서버는 accept() 에서 block 된 상태로 대기하게 된다.
이 상태에서 서버를 종료하려면, dummy connect (자기자신에게 접속) 를 사용해
accept 를 풀어주고 종료를 해야 한다.

( 그렇지 않으면, 접속처리 스레드가 join 하지 않아서 프로그램이 종료되지 않을 수 있다. )

영상

리눅스 보드 역활을 vm 으로 대신하였다.
https://youtu.be/EhwUyUxJ4io

git

https://gitlab.com/feather973/boost_linux_client
https://gitlab.com/feather973/boost_window_server

profile
관심분야 : Filesystem, Data structure, user/kernel IPC

0개의 댓글