예~~~~전에 작성한 ActionScript 코드 및 이것과 통신하는 C++ 서버 코드가 있는데, 이걸 다시 창고(…)에서 꺼낼 일이 생겼다. 전부 다시 빌드하고 – 그동안 라이브러리는 업데이트 되었는데, 이 녀석은 손 안 대서 수정할 게 좀 있더라 – 테스트 코드를 돌리기 위해서 python 서버들을 띄우고, C++ 서버를 띄우고, 테스트 클라이언트(.swf)를 연결했다.
그런데 소켓 정책 파일(flash socket policy file)을 얻어오지 못하는 게 아닌가? ((게다가 예전에도 언급했지만, 소켓 정책 서버에서 파일을 못 가져오면, 처음 붙는 소켓에 또 요청을 날리기에 C++ 서버는 예상치 못한 XML 요청을 받게 된다. =_= ))
한참 고민하고 + 코드 리뷰하고 나서야 문제를 파악했는데, 내 C++ 코드나, ActionScript 적응단 문제가 아니라 Adobe 에서 제공하는 flashsocketpolicyd 의 python 구현체 일부에 문제가 있는 코드가 있었다.
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 수준이 될까 말까한 거라곤 해도 이건 좀 아니지 않나?
약간 딴 이야기이지만요, 예전에 vs2010 feature list에 future가 없다 하셨는데 제가 확인해보니 future만이 아니라 thread, mutex, atomic 같이 멀티쓰레드 관련 라이브러리가 전부 미구현 상태더군요. tr1에 들어있지 않던 라이브러리들은 대부분 미구현 상태였습니다.
그거참 우울한 얘기네요; thread/mutex/atomic 이야 딴걸로 때운다 쳐도 future 류의 directive는 있는거랑 없는거랑 편의성이 너무 차이나는데;;