问?:
我用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.
分享到:
相关推荐
1.基于MFC通过多线程实现多个客户端同时连接服务器。 2.服务端通过维护一张转发表来实现对客户端信息的转发,比如客户端A向客户端B发送消息,服务器接收到客户端A发过来消息内容和客户端B信息之后,通过转发表查找到...
MFC多线程源码,有基于事件,关键代码段,互斥对象等实例,基于socke的实例。
基于MFC 的CSocket类实现的一个多线程的局域网文件传输,例子比较详细,希望能帮到你。
多线程的FTP客户端 VC++6.0 mfc SOCKET 套接字 多线程 C/C++
MFC GDI多线程绘图
使用线程池实现的完整的 Client/Server Socket通讯类,很容易使用,也很容易被集成到C++应用程序中。也适用于Linux/Unix。 Best C++/MFC article of February 2009
1.在MFC框架中通过多线程来实现多个客户端同时与服务器建立Socket连接。 2.通过在服务器端维护一张转发表来实现各个客户端之间的通信,比如客户端A要给客户端B发送消息,首先客户端A把消息内容和客户端B的信息发给...
MFC多线程编程 MFC多线程编程 MFC多线程编程
MFC 多线程及线程同步 MFC 多线程及线程同步 MFC 多线程及线程同步
如标题,在MFC中必须使用 AfxBeginThread创建多线程,如使用BeginThread可能会出现BUG
《MFC多线程的创建,包括工作线程和用户界面线程》全面讲解MFC多线程的创建,界面多线程与工作者多线程,多线程的起源、继承与派生,两多线程之间的区别与相同点,定时器与多线程的关系与异同(定时器是定时优先抢占...
该例子讲解了在MFC下,如何在多线程方式下利用CSOCKET进行WINDOWSOCKET编程。
mfc多线程聊天程序 mfc多线程聊天程序 mfc多线程聊天程序 mfc多线程聊天程序 mfc多线程聊天程序 mfc多线程聊天程序 mfc多线程聊天程序
MFC中利用多线程实现定时器,对于学习多线程和 ontimer的同学有用
MFC、多线程、摄像头和视频读取,通过多线程技术实现摄像头和视频的同时播放,
基于MFC开发的串口通信,技术用到API,和多线程开发串口通信
实现MFC图形聊天的基本功能,你可以学习到SOCKET和多线程的使用
MFC多线程下载MFC多线程下载
关于MFC多线程编程的基本介绍 比较适合初学者 当然也适合高手查阅