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 %d\n % 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_INT6) 로 소켓을 열어보고, 안되면 IPv4 (AF_INET) 로 소켓을 여는 구현인데, 문제는 Windows 나  일부 UNIX 구현체 들 중 일부는, IPv6 소켓이 IPv6 스택만 지원하는 형태로 여는 게 기본 값이라는 것. 덕분에 IPv4 스택을 이용하는 클라이언트 프로그램(=flash player) 랑 통신 못하는 것. 야 임마 ㅠㅠ

이게 예전에는 잘 되었던 이유는, WinSock을 사용하는 경우, 듀얼 스택 자체를 XP/2003 서버까지 지원하지 않았고 예전에는 Windows Server 2003(x64) 에서 작업했기 때문. 덕분에 try 에서 항상 예외가 나서 IPv4 소켓을 생성했기에 잘 돌았지만, Vista x64를 쓰는 지금에 와서 빵 터진 듯 Orz

듀얼 스택 지원 부분을 저렇게 안일하게 구현하면 안되지. 아무리 reference code 수준이 될까 말까한 거라곤 해도 이건 좀 아니지 않나?

  1. 게다가 예전에도 언급했지만, 소켓 정책 서버에서 파일을 못 가져오면, 처음 붙는 소켓에 또 요청을 날리기에 C++ 서버는 예상치 못한 XML 요청을 받게 된다. =_= []
Default image
Jinuk Kim
SW Engineer / gamer / bookworm / atheist / feminist
Articles: 931

2 Comments

  1. 약간 딴 이야기이지만요, 예전에 vs2010 feature list에 future가 없다 하셨는데 제가 확인해보니 future만이 아니라 thread, mutex, atomic 같이 멀티쓰레드 관련 라이브러리가 전부 미구현 상태더군요. tr1에 들어있지 않던 라이브러리들은 대부분 미구현 상태였습니다.

    • 그거참 우울한 얘기네요; thread/mutex/atomic 이야 딴걸로 때운다 쳐도 future 류의 directive는 있는거랑 없는거랑 편의성이 너무 차이나는데;;

Leave a Reply