`
duoerbasilu
  • 浏览: 1541697 次
文章分类
社区版块
存档分类
最新评论

关于mfc下多线程socket出错

 
阅读更多
问?:

我用CSocket写通信程序,但执行到下面的函数时总出错,是什么原因?
是多线程通信,每个线程创建了一个套接字:CMySocket *m_pClientSocket = New CMySocket;
然后在OnSendSocket函数中调用:m_pClientSocket->Send(str,len);
如果消息很少,或者中间有Sleep,则没有错误,否则必然出现ASSERT(pState->m_hSocketWindow != NULL);的错误。
听说
1 是一个Bug,我用VC 5.0也打了sp5,
2 同一个套接字不能在不同的线程传输,但是我每一个线程创建了一个单独的套接字
3 没有调用AfxSockInit(),但是我在每个线程的初始化中都调用了这个函数。
现在实在没有办法解决,请大家帮忙,感谢!


下面的函数是 .../MFC/SRC/SOCKCORE.CPP 里的函数。
BOOL CSocket::PumpMessages(UINT uStopFlag)
{
// The same socket better not be blocking in more than one place.
ASSERT(m_pbBlocking == NULL);

_AFX_SOCK_THREAD_STATE* pState = _afxSockThreadState;

ASSERT(pState->m_hSocketWindow != NULL); //这句出错这句出错这句出错这句出错

BOOL bBlocking = TRUE;
m_pbBlocking = &bBlocking;

答:(from microsoft)

Most frequently, this problem is due to the sharing of CSocket objects between multiple threads.

A CSocket object should be used only in the context of a single thread because the SOCKET handle encapsulated by a CAsyncSocket object is stored in a per-thread handle map. (CSocket is derived from CAsyncSocket.) Other information is stored on a per-thread basis, including a hidden notification window that MFC uses for socket notifications.

The assertion failure line, which can be found in Sockcore.cpp in the /Msvc20/Mfc/Src directory, is:

   ASSERT(pThreadState->m_hSocketWindow != NULL);

This assertion failure occurs because the CSocket object was either created or accepted in the context of another thread. The socket notification window was created in a different thread, and the m_hSocketWindow for the current thread is NULL, thus the assertion failure.

分享到:
评论

相关推荐

    windows下设置socket的connect超时

    2. **阻塞模式与非阻塞模式**:在阻塞模式下,当一个线程执行到socket操作时,如果该操作未能立即完成,则线程会被阻塞直到操作完成。而非阻塞模式下,即使操作未能立即完成,线程也不会被阻塞,而是立即返回一个...

    MFC UDP通信

    因为UDP通信是非阻塞的,所以在多线程环境下,可能需要处理并发接收和发送。可以创建多个线程来分别处理发送和接收,或者使用事件驱动的编程模型。 6. **错误处理**: MFC的网络类提供了丰富的错误处理机制,如...

    C++聊天室(MFC实现)

    多线程技术最初被认为是解决这个问题的一个方法,但实现起来可能会复杂且易出错。每个客户端连接可以被视为一个独立的任务,因此使用多线程可以让每个连接在一个单独的线程中运行,避免阻塞其他客户端的服务。然而,...

    C++ socket通讯

    例如,为了处理多个并发连接,服务器端可能需要使用多线程或者异步消息处理。同时,为了提高健壮性,我们需要捕获和处理可能出现的各种网络错误。 总之,C++的MFC Active Socket编程提供了一套面向对象的、易于使用...

    MFC疑难注解:CAsyncSocket及CSocket

    在多线程同步模式下,每个拿秒表的同学都可以独立调用你的同步函数,这样既不容易出错,效率也大大提高,只要秒表足够多,同步的效率也能达到甚至超过异步。 CAsyncSocket 用于在少量连接时,处理大批量无步骤依赖...

    CTcpSocket--Class

    本文将深入探讨VC++环境下,如何利用CTcpSocket类进行Windows环境下的TCP套接字编程,以及如何在多线程环境中使用该类。 CTcpSocket是MFC(Microsoft Foundation Classes)库提供的一种封装了Windows Sockets API的...

    VC Csocket通信最傻瓜级入门

    以上是一个简单的Csocket通信示例,实际应用中,你可能需要处理多线程、异步通信、异常处理等问题。在学习过程中,结合提供的"步步说明"逐步实践,可以更好地理解和掌握Csocket通信。 记住,虽然Csocket使得Socket...

    网络聊天程序源码

    在这个开源项目中,客户端和服务端的源码都是完整的,这对于学习网络通信和多线程编程是非常有价值的。 1. **网络通信基础**: 在这个聊天程序中,网络通信主要依赖于TCP/IP协议。TCP(Transmission Control ...

    edit光标与行数处理函数,和一些学习资料

    在编写网络程序时,编辑器的光标和行数处理函数可以帮助开发者更好地跟踪代码逻辑,尤其是在调试多线程或多进程的网络应用时。例如,当我们在调试网络请求的响应处理时,光标可以帮助定位到出错的代码行,而行数则...

    中控台服务器端工程源码打包

    4. **多线程编程**:如果服务器需要同时处理多个客户端连接,那么它可能采用了多线程技术。 5. **安全性考虑**:是否进行了安全加密,防止数据在传输过程中被截获或篡改。 总之,“中控台服务器端工程源码打包”是...

    基于SIP开发软件电话的一些资源(转自YOUTOO)

    成功安装后编译前需加OSIP_MT宏,以启用线程库,否则在程序中使用eXoSIP库时会出错,而编译时也会得到许多函数未定义的Warning提示,编译得到exosip2.lib供我们使用,当然,在此之前需要成功编译了osip2和...

Global site tag (gtag.js) - Google Analytics