티스토리 뷰

소켓 프로그램에서 송수신으로 가장 많이 사용되는 것은 recv,send 와 recvfrom, sendto 일 것이다. 전자를 TCP 용 후자를 UDP 용으로 흔히 알고 사용하는데, 그 이유는 연결지향형이 아닌 경우 매 패킷마다 주소지가 다른 데이터가 올라 올 수 있기 때문에 주소를 받거나 보낼 수 있는 시스템 콜을 사용하게 된다.

UDP의 경우 기대되는 데이터의 흐름은 다음과 같다.

서버

1. UDP 서버가 대기
2. 패킷 및 클라이언트 주소 수신
3. 클라이언트 주소로 응답 송신

클라이언트
1. 서버주소 및 요구사항 송신
2. 패킷 및 서버 주소 수신

여기서 주의할 점이 클라이언트가 데이터를 송신하고서 recvfrom 으로 대기하고 있다면, 서버가 아닌 다른 누군가가 패킷을 쏜다면 (이것은 네트웍 중간에 있는 녀석이 충분히 만들어낼 수 있다.) 그것을 자료인 양 수신하게 된다. 이 경우 클라이언트쪽에서 받은 응답만 보는 것이 아니라 udp 주소를 보고 과연 내가 보낸 송신자로부터 왔는지 확인한 후 잘못된 곳에서 왔다면 다시 대기하여야한다. UDP 포트에 아무데이터나 쏘고 없을때 돌아오는 ICMP 를 확인하는 수준의 포트스캐너가 순간 다녀간다면, 오동작할 것이 뻔하다. 환장한다.

이런 경우를 대비해서 UDP 클라이언트는 connect, send, recv를 사용하여 프로그램하는 것이 올바른 방법이다. 책을 보면, udp 소켓에서의 connect는 실제 접속을 시도하는 것이 아니라 이후에 올 send에 대해서 전송할 주소를 설정해 두는 것이고, recv에 대해서 그 주소외에서 오는 응답은 필터링을 하는 역할을 한다. 그렇다면, 당연히 UDP 클라이언트 프로그램은 connect를 사용해야하는 것이 정답이다. 예외가 없다.

정리하자면, UDP 프로그램의 서버는 sendto, recvfrom 조합을 클라이언트는 connect, recv, send를 쓰는 것이 일반적이라는 것이다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함