CSocket ::在我的MFC应用程序中创建抛出异常

时间:2009-07-18 15:44:38

标签: c++ mfc pageheap

我的应用程序(VC MFC)使用启用了Pageheap的gflags运行,以跟踪页面堆损坏。

现在应用程序崩溃并显示此错误,我无法解释这些行(除了感觉资源的可用性)

任何人都可以了解造成应用程序崩溃的原因究竟是什么?

(info:应用程序是一个多线程的,在多处理器机器上运行大约500个线程)

kernel32!RaiseException+53 
msvcrt!_CxxThrowException+36 
mfc42u!AfxThrowResourceException+19 
mfc42u!AfxRegisterWndClass+ab 
mfc42u!CAsyncSocket::AttachHandle+5c 
mfc42u!CAsyncSocket::Socket+25 
mfc42u!CAsyncSocket::Create+14 

3 个答案:

答案 0 :(得分:5)

同样的问题让我疯了但最后我修好了它并且它正在发挥作用。这是MFC套接字库的错误,当在一个线程[除主应用程序线程]之外时,如果我们尝试做类似的事情

CSocket socket;
socket.Create();

它将抛出未处理的异常。我在其上发现了一篇文章See What Microsoft says about this

从微软那里说了些什么,但这对我没有帮助。所以这里有一个我找到的解决方法,我希望它可以帮助像我这样的沮丧的家伙。

在内部线程中,执行此操作

CSocket mySock;
SOCKET sockethandle = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
mySock.m_hSocket= sockethandle;

之后不要调用mySock.Create,因为已经通过分配套接字句柄创建了它。我不确定我们是否可以使用mySock.Attach(sockethandle),因为我还没有尝试过。

之后,您可以直接致电Connect等。

当你完成使用套接字时,不要调用mySock.Close() - 而是调用closesocket(mySock.m_hSocket);这将释放套接字对象。如果Attach在上面的情况下工作,那么我想我们需要在这里做Detach来释放套接字。

祝你好运

答案 1 :(得分:0)

我想知道这是否是您实际的堆损坏问题,或者您的程序是否因为使用Pageheap运行而遇到资源限制。

我不记得确切的细节,但是Pageheap会产生额外的内存开销,以至于你可以比没有启用Pageheap的情况更快地耗尽内存。

运行500个线程时,每个线程都有1MB的堆栈,以及他们在此过程中动态分配的任何内存。

CAsyncSocket::AttachHandle如果无法创建窗口,则触发AfxThrowResourceException。由于Pageheap,您的系统似乎已经饱和。

您是否必须运行500个线程才能重现问题?也许如果你可以稍微降低这个数量,那么可用的资源会更多。

答案 2 :(得分:0)

我遇到了同样的问题,在尝试了许多事情之后,我注意到了以下CAsyncSocket参考:

创建不是线程安全的。如果要在多线程环境中调用它(该线程可以被不同的线程同时调用),请确保使用互斥锁或其他同步锁来保护每个调用。

添加Mutex同步后,它不再引发异常。