[CODE]from socket import *
s = socket(AF_INET, SOCK_DGRAM)
s.bind(('', 39))
while 1:
message, client = s.recvfrom(1024)
print "Message received"
s.sendto(message, client)[/CODE]
리눅스 환경에서 UDP 패킷을 쏘거나 수신하여 프로토콜을 테스트하는 프로그램을 작성하고 있는데, 중간 테스트를 해야 할 필요가 생겼습니다. 발생시켜서 쏘는 건 윈도우즈에서 winpcap과 ethereal 같은 패킷 캡쳐 툴을 써서 확인했습니다만, UDP 패킷을 정상적으로 수신하는 지 확인하기 위해 TCP/UDP 수준에서 확인하려니 약간의 애로 사항이 생기더군요. 수신할 UDP 패킷을 전송하는 역할을 해줄 상대가 필요한데, 급한 대로 가져다 쓸 수 있는 다른 리눅스 머신이 없었습니다.
작업하다 일어나서 장비 하나 수습하기도 귀찮고 해서, 개발 중인 리눅스 머신에서 쏜 UDP 패킷을 내 노트북에서 받으면 그대로 돌려보내주는 일종의 echo 서버를 하나 짜서 돌리기로 했습니다. 마침 노트북에 python이 깔려있어서, python으로 작성하기로 했습니다.
해야 할 일은 딱 하나였습니다... 바로 웹 검색. --); 찾아보니 위의 코드가 제일 간단한 듯 해서 가져다 썼습니다. print 문을 제외하면 socket API 네 개로만 구성된 초 간단 서버. 소켓 s의 메소드 형태로 함수를 호출하기 때문에 함수 인수에서 소켓 디스크립터를 뺄 수 있습니다. 그리고 recvfrom() 함수에서처럼 두 가지(메시지와 주소)의 반환 값을 받아올 수 있기 때문에 함수 인수에 포인터 변수를 따로 넘겨 받아올 필요도 없습니다. 결과적으로 간결하고 직관적인 코드를 갖고 서버를 실행할 수 있었습니다.
그리고 짜는 즉시 실행시켜서 결과를 확인할 수 있고, 아뭏든 요즘은 이런 장점들 때문에 스크립트 류의 언어에 점점 입맛이 맞춰지고 있습니다. :)

