Adobe FlashSocketPolicyDaemon (python) 코드의 버그
예~~~~전에 작성한 ActionScript 코드 및 이것과 통신하는 C++ 서버 코드가 있는데, 이걸 다시 창고(…)에서 꺼낼 일이 생겼다. 전부 다시 빌드하고 – 그동안 라이브러리는 업데이트 되었는데, 이 녀석은 손 안 대서 수정할 게 좀 있더라 – 테스트 코드를 돌리기 위해서 python 서버들을 띄우고, C++ 서버를 띄우고, 테스트 클라이언트(.swf)를 연결했다.
그런데 소켓 정책 파일(flash socket policy file)을 얻어오지 못하는 게 아닌가?1
한참 고민하고 + 코드 리뷰하고 나서야 문제를 파악했는데, 내 C++ 코드나, ActionScript 적응단 문제가 아니라 Adobe 에서 제공하는 flashsocketpolicyd 의 python 구현체 일부에 문제가 있는 코드가 있었다.
class policy_server(object):
def __init__(self, port, path):
self.port = port
self.path = path
self.policy = self.read_policy(path)
self.log('Listening on port %dn' % port)
try:
self.sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
except AttributeError, socket.error:
# AttributeError catches Python built without IPv6
# socket.error catches OS with IPv6 disabled
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
IPv6 (AF_INET6
) 로 소켓을 열어보고, 안되면 IPv4 (AF_INET
) 로 소켓을 여는 구현인데, 문제는 Windows 나 일부 UNIX 구현체 들 중 일부는, IPv6 소켓이 IPv6 스택만 지원하는 형태로 여는 게 기본 값이라는 것. 덕분에 IPv4 스택을 이용하는 클라이언트 프로그램(=flash player) 랑 통신 못하는 것.
이게 예전에는 잘 되었던 이유는, WinSock을 사용하는 경우, 듀얼 스택 자체를 XP/2003 서버까지 지원하지 않았고 예전에는 Windows Server 2003(x64) 에서 작업했기 때문. 덕분에 try 에서 항상 예외가 나서 IPv4 소켓을 생성했기에 잘 돌았지만, Vista x64를 쓰는 지금에 와서 빵 터진 듯.
듀얼 스택 지원 부분을 저렇게 안일하게 구현하면 안되지. 아무리 reference code 수준이 될까 말까한 거라곤 해도 이건 좀 아니지 않나?
-
예전에도 언급했지만, 소켓 정책 서버에서 파일을 못 가져오면, 처음 붙는 소켓에 또 요청을 날리기에 C++ 서버는 예상치 못한 XML 요청을 받게 된다. ↩︎