Notice»

Recent Post»

Recent Comment»

Recent Trackback»

Archive»

« 2024/3 »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

MFC Static라이브러리 소켓사용시 버그!

2008에서도 마찬가지로 해결안됨.


문제

USN사업에서!!

웹뷰어를 2008로 만들었는데..

MFC 배포 문제때문에 MFC라이브러리를 포함(Static)해버렸다.

 

그러고선 테스트했을때는 문제 없더니.

8개 거점의 페이지를 팝업으로 띄우는 홈페이지에서..

한번 띄우고 나면 그다음 페이지에선 접속타이밍쯤 죽는 문제가 계속 발생했다.

특히 ie7에서..

 

찾아보니.. 소켓의 Connect함수에서 죽더라..

도로공사 전송프로그램에서도 그런 일이 있었는데..

소켓이 재접속할때마다 delete하고 new하면 죽는경우가 발생하더라..

그래서 그부분도 new는 한번만하고 Close,Init,Connect로 처리를 했었는데..

 

웹뷰어도 그렇게 처리해고 별짓을 다해봤으나 결과는 똑같았다.

그래서 위의 에러를 이용해서 열심히 웹서핑을 했다!

http://support.microsoft.com/kb/q193101/

http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=320317&ref=320055

 

의외로 많은 질문을 봤고.. 결국 MFC Static라이브러리의 버그라는걸 알았다.

6.0에 있던 고질적인 버그가 2008까지 오다니.. 최악이다..

Thread에서 재접속(?)시 일어나는 버그라는데.. ActiveX이고 같은 페이지여서 문제였던가?

아무튼 저 소스를 OnCreate에서 함수로 만들어서 호출했더니 문제가 싹 사라졌다.. ㅡ.ㅡ;;

정석이 뭔진 모르겠다..

   void SocketThreadInit()
   {
   #ifndef _AFXDLL
   #define _AFX_SOCK_THREAD_STATE AFX_MODULE_THREAD_STATE
   #define _afxSockThreadState AfxGetModuleThreadState()

      _AFX_SOCK_THREAD_STATE* pState = _afxSockThreadState;
      if (pState->m_pmapSocketHandle == NULL)
         pState->m_pmapSocketHandle = new CMapPtrToPtr;
      if (pState->m_pmapDeadSockets == NULL)
         pState->m_pmapDeadSockets = new CMapPtrToPtr;
      if (pState->m_plistSocketNotifications == NULL)
         pState->m_plistSocketNotifications = new CPtrList;

   #endif
   }
: