我在我的程序中要加入一个SOCKET队列用于连接多台计算机它们在后台线程下自动工作可是在退出时为什么总是出错

解决方案 »

  1.   

    http://www.codeproject.com/internet/JBSocketServer1.asp
    http://www.codeproject.com/internet/JBSocketServer2.asp
      

  2.   

    主线程
    ////////////
    // 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)
    为何会这样呢?
      

  3.   

    要解决有多个client端..你可以通过对某个端口先初始化,再用循环调用语句对其端口进行读信息....
      

  4.   

    你应该等所有的子线程退出之后再退出主线程。
    你是窗体句柄出错还是Socket出错?
      

  5.   


    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() 时发生上述错误的.好象与线程的同步等问题没有关系吧
      

  6.   

    有可能是你的SOCKET重复关闭了吧
      

  7.   

    菜单PROJECT->SETTING->GENERAL标签->MICROSOFT FOUNDATION CLASSES设为:USER MFC IN SHARE DLL->确定
      

  8.   

    我忘记了
    不用试了,我的DEBUG设定的本来就是  share dll  我的 Release 中设定的是 Static 静态链接COOL 吧
    两种情况都不对
      

  9.   

    我还是还是这里的问题
    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;
    }
      

  10.   

    CAsyncSocket对象需要一个隐藏窗口,用于处理SOCKET消息。
      

  11.   

    标准c的网络程序和来窗口的概念,所以一定是你程序出了bug
      

  12.   

    我用的是 CSocket
    它好象是从 CAsyncSocket派生出来的
    您的意思的我如果要建立一个SOCKET队列则同时还要建立一个WINDOWS队列?
    不能不用吗?
    不能同时使用Mainframe吗?
      

  13.   

    alien_taiji(笑了) :标准c的网络程序和来窗口的概念????不懂您说的,我试过直接使用API函数
    在它的使用过程中同样要使用一个 AsyncSeclect(大概没错) 来选取一个窗口
    设定要处理的消息到该窗口中去。我想我这一点还是没有说错的
      

  14.   

    CAsycnSocekt内含了一个隐藏窗口,该窗口一般不需要手工创建,但是在辅助线程中的SOCKET(包括UI和WORK线程),则没有这个窗口,从而造成ASSERT错误。
      

  15.   

    Bind:
        我就是在WORK线程中使用的
        但是我把它改到了 MAINFRAME中生成和消毁
    只在工作线程中使用。
        还是有问题?
        我试了很多方法不行了    我要如何改呢?
      

  16.   

    明白了,在MAINFRAME中调用SOCKET的Detache,在辅助线程中调用SOCEKT的Attach。
    注意:此辅助线程必须是一个UI线程!!!!
      

  17.   

    这样的:
        我有一个工作线程,用来和很多通信单元通信,现在要加入网络模块    我在该工作线程中先加了一个用于 Listen 的服务端,在退出时不成功
    出错如上,我就把它改在 MainFrame 中生成和删除(搞定)    下面我要加入一个用于 Connect 的客户队列,以便可以同时和多个在 Listen 的服务端连接,
        此时不管理我如何改在退出时都会有上面的错误提示.
    ---> ASSERT(pState->m_hSocketWindow != NULL);
      

  18.   

    这是我的工作线程,
    class CSaimThreadIO : public CWinThread
    {}这个线程应是一个 User Interface 线程吧。不过您提醒我了,我不是调用的 Attach() 和 Deattach() 而是在Mainfram中写一个函数,new 一个Socket 再把指针线 CSaimThreadIO 中指定的端口使用
    我是否要使用 Attach 和 Deattach?
      

  19.   

    为什么不用同步方式,
    http://idoor.xiloo.com
    上有篇文章,值得一看
      

  20.   

    CMainfram f()
    {
      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);
      ...
    }
      

  21.   

    cqjiang(蒋天书)真的很不错
    我也是作这一行的
    不过公司就我一个人作程式  :-)
      

  22.   

    Bind:
       谢谢
       我用Attach再试一下
       下面我可把我的程式再具体一点,在我的 ThreadIO 中有一个 Station的列表,用户可以自已定义使用的网络端口数目,   在 Mainframe 中生成线程,在线程中根据用户定义生成 Station 的列表如果存在 ClientSocket 则调用 MainFrame 中一个函数生成了一个Socket 并保存在MainFrame中的SOCKET列表中。返回SOCKET的指针,Station保存
       运行中  STATION 则使用保存的 SOCKET 来发送和读取数据。   退出时,在MAINFRAME中关闭所有的SOCKET,它们已保存在一个列表中了。   我把返回指针保存后使用,改为ATTACH 到 MAINFRAME 中生成的SOCKET 再试试
      

  23.   

    cqjiang(蒋天书)
    那上面的软件都是您写的吗?太COOL了您
      

  24.   

    CAsyncSocekt对象不能跨线程,这点我再强调一下!!!按你的意思,就按我说的这样做吧,应该没问题的。
      

  25.   

    不行啊
    我的程式好象改得太乱了我现在的问题又来了pHostNetPort->m_pHostSocket->Attach(pMainWnd->CreateHostSocket()->m_hSocket);一步步的调试运行
    pMainWnd 中的  Socket 已建立
    Attach时出错头大
    下班了,
    晚上回家再看看
    如果您在
    希望明天下午再聊这个问题明天见