目前,似乎是那些用不到成员变量的成员函数能访问,但其他的函数会报错,是wincore 890行。
现在是这个函数报错,函数是没问题的,不在线程里执行是可以实现的,但一旦在线程中执行就要报错。
void CMyDlg::StartListen()
{
InitVariable();
UpdateData(FALSE);
if(m_nSerCurState!=IsStart)
{
//MessageBox(m_cIP);
if(m_sListenSock.Create(m_nPort,SOCK_STREAM,m_cIP))//创建socket
{
m_cSerCurState=Enum2CString(IsStart);
MessageBox(m_cSerCurState);
if (!m_sListenSock.Bind(m_nPort,m_cIP))//将本地地址与socket绑定在一起
{
MessageBox("绑定失败!");
}

m_sListenSock.Listen(5);//开启监听
WSAAsyncSelect(m_sListenSock,GetSafeHwnd(),ACCEPT_EVENT,FD_ACCEPT|FD_READ|FD_CLOSE);//转变阻塞模式
//WSAAsyncSelect的返回值决定是否成功执行。此函数目的是将阻塞模式转为非阻塞模式,即执行完函数立即返回,若事件发生
//则通过消息告诉窗口,执行相应的函数
//m_bStarting=TRUE;//开始侦听了
}
OutputLastError();
}  
UpdateData(FALSE);
}//监听线程
DWORD WINAPI ListenProc(
LPVOID lpParameter)
{
//开始监听
CMyDlg *dlg=((CMyDlg*)lpParameter);
dlg->StartListen();//调用StartListen函数报错
//AfxMessageBox(dlg->GetIP());调用GetIP函数就可以
return 0;
}void CMyDlg::OnBtnStart() 
{
// TODO: Add your control notification handler code here

/*创建一个线程用于处理与客户端的数据交互*/
DWORD dwThread; /*lpInfo *lpPara;//参数
lpPara=new lpInfo;

//开始监听
StartListen();

//微软不建议把CSocket对象作为参数传递,理由是容易出错。   
    //Detach()和Attach()传递套接字句柄,而不是传递CSocket实例本身
lpPara->s_socket.Attach(m_sListenSock.Detach());
*/
//创建一个监听线程
m_hListenThread=CreateThread(NULL,0,ListenProc,/*(LPVOID)(lpPara)*/this,0,&dwThread);
//创建线程信息结构体对象
threadInfo info;
info.s_dwThreadID=dwThread;
info.s_end=FALSE;
m_threadInfo.AddHead(info);
m_dListenID=dwThread; //OutputLastError();
}可以看到调用GetIP没问题,但调用StartListen函数报错拜托大家帮忙看看,谢谢了,很急啊!

解决方案 »

  1.   

    我觉得问题可能在这个变量:m_nSerCurState,它要等于某个值,才会创建SOCKET,如果不等于呢?你没进行判断,直接listen了:if(m_nSerCurState!=IsStart) 

    //MessageBox(m_cIP); 
    if(m_sListenSock.Create(m_nPort,SOCK_STREAM,m_cIP))//创建socket 

    m_cSerCurState=Enum2CString(IsStart); 
    MessageBox(m_cSerCurState); 
    if (!m_sListenSock.Bind(m_nPort,m_cIP))//将本地地址与socket绑定在一起 

    MessageBox("绑定失败!"); 
    } m_sListenSock.Listen(5);//开启监听 当然这只是一个可能性,你最好把报错的堆栈附上来看看
      

  2.   

    报的错误是什么呢?
    m_cSerCurState=Enum2CString(IsStart);
    你确定这个转换以后,m_cSerCurState == IsStart ?把m_cSerCurState换成BOOL变量,初始FALSEm_cSerCurState=Enum2CString(IsStart);改为m_cSerCurState = TRUE;
    或者 ListenProc
    改为
    DWORD WINAPI ListenProc( 
    LPVOID lpParameter) 

    //开始监听 
    CMyDlg *dlg=((CMyDlg*)lpParameter); 
    if(dlg->m_nSerCurState!=IsStart) 
    dlg->StartListen();//调用StartListen函数报错 
    //AfxMessageBox(dlg->GetIP());调用GetIP函数就可以 
    return 0; 

      

  3.   

    IsStart是我用的枚举,这个错误我查过了,大家都认为线程中不要用CSocket,且微软也承认CSocket不安全,所以我决定用API了,谢谢大家关注,散分