본문 바로가기

Eureka/Coding

[Tip] UDP Socket Programming Precautions in Linux

Linux에서 UDP Socket Programming을 할때 주의사항 중 하나가 자신이 통신 포트를 60000이라 한다고 치자.
이때 소켓 통신을 하기 위해 아래와 같이 코딩을 할텐데 


memset(&svr_addr, 0, sizeof(svr_addr));
svr_addr.sin_family = AF_INET;
svr_addr.sin_addr.s_addr = htonl(INADDR_ANY);
svr_addr.sin_port = htons(60000);


실질적으로 통신 포트를 서버와 클라이언트 모두 htons(60000);로 셋팅 하여도 recvfrom으로 들어오는 포트의 값은 달라진다.
아래 로그는 서버 프로그램을 "strace -f -s 1024"명령어를 주어 터미널에서 
"$ strace -f -s 1024 ./ex_server 60000" 로 실행했을 때 클라이언트와 통신시 나오는 정보이다.


recvfrom(3, "Nathaniel~~~~~~~ fewq", 228, 0, {sa_family=AF_INET, sin_port=htons(45091), sin_addr=inet_addr("127.0.0.1")}, [16]) = 228
sendto(3, "Nathaniel, fewq", 228, 0, {sa_family=AF_INET, sin_port=htons(45091), sin_addr=inet_addr("127.0.0.1")}, 16) = 228
write(1, "IP: 127.0.0.1\n", 20IP: 127.0.0.1)   = 20
write(1, "Nathaniel: fewq\n", 16Nathaniel: fewq)       = 16


위에 잘 보면 recvfrom에서 포트가 htons(45091)로 통신이 되는 것을 확인 할 수 있다.
이때 또한 주의 할 사항은 클라이언트가 메시지를 서버로 송신할때마다 해당 포트가 바뀐다는 점이다.

필자는 아이피 정보만 가지고 최근 송수신한 클라이언트 정보를 관리하다 삽질하며 발견한 사실이다... 
클라이언트를 관리하는 다른 방법도 있겠지만 조금 아날로그식으로 관리 한다면,
포트도 함께 관리하지 않으면 데이터 송수신이 정상적으로 이뤄지지 않을 수 있다.