请问:
调用 AfxSocketInit() 成功后,
程序结束前,是否需要调用 WSACleanup ?

解决方案 »

  1.   

    程序结束前,可以不调用,进程结束时,会释放所有资源的。如果你只是在程序中使用一下socket,然后,对socket 已不再需要,可以马上调用WSACleanup释放资源。
      

  2.   

    msdn 里对 AfxSocketInit 的例子里,没有调用WSACleanup
    查看 AfxSocketInit  源代码,核心也只是调用了 WSAStartup 而已。
    但 调用 WSAStartup 不是应该用 WSACleanup 释放么?
    为什么 msdn AfxSocketInit  例子里 不调用 WSAStartup ?
      

  3.   

    而且 msdn 里说的是:This function also ensures that WSACleanup is called for you before the application terminates. why? 用什么机制保证的?
      

  4.   

    利用了函数指针。
    其实你不用去管这么多的细节,反正这个函数会帮你完成WSACleanup的。
      

  5.   

    就算是利用函数指针,但也得至少调用两次相关函数啊。释放的动作,应该不是在AfxSocketInit 中实现的。
    我之所以关注,是因为想了解透彻。我不只用mfc编程,所以我想弄清楚 底层的事情以及mfc中实现的原理。
      

  6.   

    我在汇编页面下把断点设在WSACleanup的入口,发现在我手工调用的情况下,可以触发并断下来,但如果不手工调用,就触发不了。
    应该是没有调用WSACleanup,可能MS觉得反正进程退出就释放掉了,也就不再手工调用了。
      

  7.   

    _AFX_SOCK_STATE::~_AFX_SOCK_STATE()
    {
    if (m_pfnSockTerm != NULL)
    m_pfnSockTerm();
    }