静态MFC CSocket CAsyncSocket map_pp.cpp错误

静态MFC,在线程中使用SOCKET,发生错误:

Debug Assertion Failed!
Program:...
File:f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\map_pp.cpp
Line:179

这是MFC的一个BUG,在6.0中就发现,可惜微软到VS2013还是没有修改,估计这个东西微软也要淘汰了,懒得改了,下面是MSDN的解决方法:

When using MFC sockets in secondary threads in a statically linked MFC 
Visual C++ 6.0 application, an unhandled exception occurs. The reason for 
the unhandled exception is that an object of type CMapPtrToPtr pointer, 
pointed to by m_pmapSocketHandle, is never created. 
To resolve it the handle maps used by the sockets need to be created for 
each thread.The following code shows a function to do this: 
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 

This function should be called once in each secondary thread before the 
first socket is created in the new thread.

IMP : This bug was corrected in Visual Studio 6.0 Service Pack 3

最后这句就是屁话了,我在2013中试了,还是错误,可恶!

时间: 2024-08-08 21:28:59

静态MFC CSocket CAsyncSocket map_pp.cpp错误的相关文章

MFC CSocket和CAsyncSocket的连接

MFC CSocket和CAsyncSocket的连接 flyfish 2015-1-31 CSocket的Connect是阻塞的. 所以代码类似 if(!Connect()) { } 判断成功还是失败 CAsyncSocket的Connect是非阻塞的 当调用CAsyncSocket::Connect连接一个服务器 虽然CAsyncSocket::Connect函数返回值是BOOL类型, 但代码不是 if(!Connect()) { } 当连接操作完成,完成(complete)!=成功(suc

socket API CSocket CAsyncSocket 用法及区别

要进行网络编程就要和Socket打交道,Socket有同步阻塞方式和异步非阻塞方式两种使用,事实上同步和异步在我们编程的生涯中可能遇到了很多,而Socket也没什么特别.虽然同步好用,不费劲,但不能满足一些应用场合,其效率也很低.    或许初涉编程的人不能理解"同步(或阻塞)"和"异步(或非阻塞)",其实简单两句话就能讲清楚,同步和异步往往都是针对一个函数来说的,"同步"就是函数直到其要执行的功能全部完成时才返回,而"异步"

MFC如何使用静态MFC库

大部分MFC程序都是使用 在共享DLL中使用MFC ,但是VS每一个版本都需要一个 MFC运行库,实在是有点烦人. 所以我选择了使用静态MFC库,虽然文件会大一些,但是至少不麻烦了. VS这个做的不够好,默认情况下居然报错: VC编译错误: 1>uafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@[email protected]) 已经在 LIBCMT.

IIS7出现“HTTP 错误 404.17 - Not Found 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理。”错误-Windows-

Errore HTTP 404.2 - Not Found" IIS 7.5 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理 如果你用了安全狗,可能只看到404错误,请打开狗,资源保护--响应内容保护.点“-”号删掉404防护.才能出现上方的错误信息.如果是,则按照下方操作进行. 出现这种情况的原因通常是因为先安装了Framework,后安装的IIS: 运行cmd,输入: C:\Windows\Microsoft.NET\Framework\V4.0.30319\aspnet_regi

MFC CSocket AfxBeginThread PossMessage Menu 自定义消息

1 // StockServerDlg.h : 头文件 2 // 3 4 #pragma once 5 #include "afxwin.h" 6 7 UINT ThreadProc(LPVOID pParm); 8 9 struct threadInfo 10 { 11 char recvMsg[256]; 12 char sendMsg[256]; 13 HWND hWnd; //主窗口句柄,用于消息的发送 14 }; 15 16 // CStockServerDlg 对话框 17

MFC中CAsyncSocket及其派生类对象跨线程使用方法

存在的现象 在MFC中用多线程方法开发WinSocket通讯程序时,如果你的的是API方式,自然没有以下说的问题.但如果当你使用CAsyncSocket及其派生类(CSocket或是你自己的写的)来开发的话,会发现在不同线程中使用CAsyncSocket及其派生类对象时,会出现程序崩溃.这里所说的跨线程,是指该对象在一个线程中调用Create/Close/Attach/Detach函数,然后在另外一个线程中调用其他成员函数如Receive/ReceiveFrom/Send/SendTo等.下面是

VS2013 MFC 库冲突引起的错误解决

http://www.cnblogs.com/rainbowzc/archive/2010/06/29/1767248.html 7 1>LIBCMT.lib(crt0dat.obj) : error LNK2005: _exit 已经在 msvcrtd.lib(MSVCR80D.dll) 中定义 链接器->输入->忽略特定库: libcmt.lib

CAsyncSocket,CSocket内幕及其用法

由于需要写个wince通信程序,首先想到的是c#,但觉得c#写那个太简单了点于是选择了稍微难点的mfc,但是没想到mfc中的csocket在wince中竟然会报异常,悲催,经查证,原来是indows CE Embeded不支持异步传输模式(例如WSAAsyncSelect函数),而mfc中的套接字都是基于异步实现的,因此,很无奈,只能使用原始的winsock了,具体如下 Socket API,CAsyncSocket,CSocket内幕及其用法jmcooler(原作)    关键字     So

MFC 编译链接错误:unresolved external symbol

编译MFC程序过程出现以下错误: Error LNK2019 unresolved external symbol __imp___vsnprintf 解决方法:在Visual Studio工程选项,链接器附加依赖项里面添加legacy_stdio_definitions.lib即可. LNK2001 unresolved external symbol __imp___iob 解决方法:在程序中重新定义_iob, 加上这段代码:extern"C" { FILE _iob[] = {