如题,MFC的工程向导会为我生成这样的一段CWinApp的代码:BOOL CDialog006App::InitInstance()
{
if (!AfxSocketInit())
{
AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
return FALSE;
}我想问的是, 这个地方如果我把AfxSocketInit换成WSAStartup,会不会导致这个MFC程序出什么问题
AfxSocketInit做的工作难道更多么?

解决方案 »

  1.   

    一般来说 WASAtarup() 是应用程序调用的windows sockets dll的第一个函数,在调用任何winsock api之前,必须调用wsastartup()进行初始化,最后调用WSACleanup()做清理工作. 也就是 wsastartup 与 wsacleanup 要配对使用. MFC中的函数 AfxSocketInit() 包装了函数 WSAStartup(), 在支持WinSock的应用程序的初始化函数IninInstance()中调用AfxSocketInit()进行初始化, 程序则不必调用WSACleanUp().       如果你再次调用wsacleanup, 难不定会出问题, 我的一个FTP 程序里退出时调用了此函数, 在 N>8 次上传后挂掉了
      

  2.   

    这个是一样的效果,当然可以自己用WSAStartup来初始化WinSock运行环境了。
      

  3.   

    AfxSocketInit出来调用WSAStartup,应该还进行了其他操作。MFC程序建议还是用AfxSocketInit。
      

  4.   

    AfxSocketInit也是在内部调用WASAtarup
    只不过该做的工作他们替你做好了就留个函数给你直接调用
      

  5.   

    AfxSocketInit()函数定义:
    BOOL AFXAPI AfxSocketInit(WSADATA* lpwsaData)
    {
    // Reference the start up function to pull in wsock32.dll
    // This is to prevent problems with delay loading wsock32.dll from mfc*.dll
    // WSAStartup should never be NULL
    if (WSAStartup != NULL)
    return _AfxSocketInit(lpwsaData);
    return FALSE;
    }
    调用了_AfxSocketInit()函数,_AfxSocketInit()函数的定义:#ifndef _AFXDLL
    BOOL AFXAPI AfxSocketInit(WSADATA* lpwsaData)
    #else
    BOOL AFXAPI _AfxSocketInit(WSADATA* lpwsaData)
    #endif
    {
    _AFX_SOCK_STATE* pState = _afxSockState.GetData();
    if (pState->m_pfnSockTerm == NULL)
    {
    // initialize Winsock library
    WSADATA wsaData;
    if (lpwsaData == NULL)
    lpwsaData = &wsaData; WORD wVersionRequested = MAKEWORD(1, 1);
    int nResult = WSAStartup(wVersionRequested, lpwsaData);
    if (nResult != 0)
    return FALSE; if (LOBYTE(lpwsaData->wVersion) != 1 || HIBYTE(lpwsaData->wVersion) != 1)
    {
    WSACleanup();
    WSASetLastError (WSAVERNOTSUPPORTED);
    return FALSE;
    } // setup for termination of sockets
    pState->m_pfnSockTerm = &AfxSocketTerm;
    }#ifndef _AFXDLL
    //BLOCK: setup maps and lists specific to socket state
    {
    _AFX_SOCK_THREAD_STATE* pThreadState = _afxSockThreadState;
    if (pThreadState->m_pmapSocketHandle == NULL)
    pThreadState->m_pmapSocketHandle = new CMapPtrToPtr;
    if (pThreadState->m_pmapDeadSockets == NULL)
    pThreadState->m_pmapDeadSockets = new CMapPtrToPtr;
    if (pThreadState->m_plistSocketNotifications == NULL)
    pThreadState->m_plistSocketNotifications = new CPtrList;
    }
    #endif return TRUE;
    }
      

  6.   

    可以的, 只是结尾要WSACleanup一下