我在我的程序中要加入一个SOCKET队列用于连接多台计算机它们在后台线程下自动工作可是在退出时为什么总是出错
解决方案 »
- 2个断言看不明白,好像是用来确定菜单中必须有某个菜单项的,谢谢知道的人能给解释一下吗?
- ADO 初级问题:急啊,在线等待。。。
- 还是以前的一个老问题,可是现在出错了。
- 分配内存出现的错误
- 采用pppoe协议的adsl如果防止用户多户上网?
- 关于异步选择的问题
- 关于CString类这么简单的问题我都不会,请高手赐教!
- 做一个OCX插件,请问怎样自动在网页的文本框中输入文本,以及在图片显示区输出图片?
- 如何读取服务器转换地址后的页面?
- directDraw显示实时视频,但鼠标老是闪烁?
- 在线等待。。。。如何调用OnPaint()事件
- *****请问高手,一个installshield安装文件的制作问题,做好setup.exe后,运行这一安装程序后出现如下错误:****
http://www.codeproject.com/internet/JBSocketServer2.asp
////////////
// CSaimThreadIO threadclass CSaimThreadIO : public CWinThread
{
//站点类队列
//作用: 根据用户定义的文件生成不同的下位机单元,保存在该队列中
// 完成对该下位机单元的管理,如发送查询命令,读取上传数据,
// 转换成实际值
public:
CTypedPtrArray<CObArray,CStation*>StationArray; }//在他初始化时打开网落
BOOL CSaimThreadIO::InitInstance()
{
connect;
}//在它退出时关闭
int CSaimThreadIO::ExitInstance()
{
disconnect;
}
没有办法我只好这样了,在MainFrame中生成对象,在线程中调用,但是
还是不能有多个 client// 查看用户是否定义了网络服务器,如果定义了网络服务器则启动
// 在主WND中建立SOCKET
// 万不能改到 CSaimThreadIO 中 或 CStation 中,
// 因为改为其中则在退出 SOCKET 时会出错
// ASSERT(pState->m_hStateWindow != NULL)
BOOL CMainFrame::InitNetSever()
{}
// ASSERT(pState->m_hStateWindow != NULL)
为何会这样呢?
你是窗体句柄出错还是Socket出错?
BOOL CAsyncSocket::AsyncSelect(long lEvent)
{
ASSERT(m_hSocket != INVALID_SOCKET); _AFX_SOCK_THREAD_STATE* pState = _afxSockThreadState;
问题---> ASSERT(pState->m_hSocketWindow != NULL); return WSAAsyncSelect(m_hSocket, pState->m_hSocketWindow,
WM_SOCKET_NOTIFY, lEvent) != SOCKET_ERROR;
}在调用 void CSocket::Close() 时发生上述错误的.好象与线程的同步等问题没有关系吧
不用试了,我的DEBUG设定的本来就是 share dll 我的 Release 中设定的是 Static 静态链接COOL 吧
两种情况都不对
BOOL CAsyncSocket::AsyncSelect(long lEvent)
---> ASSERT(pState->m_hSocketWindow != NULL);
^^^^^^^^^^^^^^^^^^^^^^->这丫的是干嘛的?但我把它改在MAINFRAME中,还是不对//生成服务器SOCKET返回
CHostSocket* CMainFrame::CreateHostSocket()
{
CHostSocket* pTempSocket;
pTempSocket = NULL; pTempSocket = new CHostSocket;
if( pTempSocket == NULL )
return NULL; if( pTempSocket == NULL )
{
OutputSocketError();
OutputDebugString("New 服务端SOCKET失败\n");
return NULL;
} if( pTempSocket->Create() == 0 )
{
OutputSocketError();
OutputDebugString("Create 服务端SOCKET失败\n");
delete pTempSocket;
return NULL;
}
HostSocketArray.Add(pTempSocket);
return pTempSocket;
}
它好象是从 CAsyncSocket派生出来的
您的意思的我如果要建立一个SOCKET队列则同时还要建立一个WINDOWS队列?
不能不用吗?
不能同时使用Mainframe吗?
在它的使用过程中同样要使用一个 AsyncSeclect(大概没错) 来选取一个窗口
设定要处理的消息到该窗口中去。我想我这一点还是没有说错的
我就是在WORK线程中使用的
但是我把它改到了 MAINFRAME中生成和消毁
只在工作线程中使用。
还是有问题?
我试了很多方法不行了 我要如何改呢?
注意:此辅助线程必须是一个UI线程!!!!
我有一个工作线程,用来和很多通信单元通信,现在要加入网络模块 我在该工作线程中先加了一个用于 Listen 的服务端,在退出时不成功
出错如上,我就把它改在 MainFrame 中生成和删除(搞定) 下面我要加入一个用于 Connect 的客户队列,以便可以同时和多个在 Listen 的服务端连接,
此时不管理我如何改在退出时都会有上面的错误提示.
---> ASSERT(pState->m_hSocketWindow != NULL);
class CSaimThreadIO : public CWinThread
{}这个线程应是一个 User Interface 线程吧。不过您提醒我了,我不是调用的 Attach() 和 Deattach() 而是在Mainfram中写一个函数,new 一个Socket 再把指针线 CSaimThreadIO 中指定的端口使用
我是否要使用 Attach 和 Deattach?
http://idoor.xiloo.com
上有篇文章,值得一看
{
CMySock* pSock = new CMySock;
....
CMyThread* pThread = ::AfxBeginThread(..., CREATE_SUSPENDED);
...
pThread->m_hSocket = pSock->Detach();
pThread->ResumeThread();
...
}class CMyThread : public CWinThread
{
SOCKET m_hSock;
CMySock m_Sock;
};
CMyThread::InitInstance()
{
m_Sock.Attach(m_hSock);
...
}
我也是作这一行的
不过公司就我一个人作程式 :-)
谢谢
我用Attach再试一下
下面我可把我的程式再具体一点,在我的 ThreadIO 中有一个 Station的列表,用户可以自已定义使用的网络端口数目, 在 Mainframe 中生成线程,在线程中根据用户定义生成 Station 的列表如果存在 ClientSocket 则调用 MainFrame 中一个函数生成了一个Socket 并保存在MainFrame中的SOCKET列表中。返回SOCKET的指针,Station保存
运行中 STATION 则使用保存的 SOCKET 来发送和读取数据。 退出时,在MAINFRAME中关闭所有的SOCKET,它们已保存在一个列表中了。 我把返回指针保存后使用,改为ATTACH 到 MAINFRAME 中生成的SOCKET 再试试
那上面的软件都是您写的吗?太COOL了您
我的程式好象改得太乱了我现在的问题又来了pHostNetPort->m_pHostSocket->Attach(pMainWnd->CreateHostSocket()->m_hSocket);一步步的调试运行
pMainWnd 中的 Socket 已建立
Attach时出错头大
下班了,
晚上回家再看看
如果您在
希望明天下午再聊这个问题明天见