我的意图是创建一个监听套接字,客户连接时发"J"给服务器,
离开时发"L",(连接和离开都建立一次与服务器的连接)
服务器根据收到的字符输出客户连接和离开的
信息,我写了下面的代码,是一个有MFC支持的程序,为什么
我运行时程序会像死机一样僵在那,而把这段代码稍改后加到
一个控制台程序中却能正常显示客户的加入与离开?
        CString msg="Host ";
CString s1=" join group.";
    CString s2=" leave group.";
listen( m_TCPSocket, 8 ); while( 1 )
{
     Accept=accept( m_TCPSocket, (sockaddr*)&client_addr, &clientsize );
if( Accept == INVALID_SOCKET )
{
MessageBox( "Accept connections failed!", "Error!", MB_OK );
                        continue;
}
while( (recvmsg=recv( Accept, TCPBuf, sizeof(TCPBuf)-1, 0)) != 0 )
{
TCPBuf[recvmsg]='\0';
if( TCPBuf[0] == 'J' )
{
msg=msg+(inet_ntoa(client_addr.sin_addr))+s1;
                                m_mberlist.AddString(msg);
                                recvmsg=0;
        break;
}
else if( TCPBuf[0] == 'L' )
{
msg=msg+(inet_ntoa(client_addr.sin_addr))+s2;
                                m_mberlist.AddString(msg);
                                recvmsg=0;
break;
}
                else
{
                                recvmsg=0;
break;
}
}
closesocket( Accept );
}

解决方案 »

  1.   

    执行listen和accept操作程序就会“死”在那里,解决的方法是把这些操作写进线程函数。
      

  2.   

    因为这是阻塞操作
    你又在同一个线程内你可以用非阻塞Socket(OnAccept....)或多线程来做
      

  3.   

    我的意图是创建一个监听套接字,客户连接时发"J"给服务器,
    离开时发"L",(连接和离开都建立一次与服务器的连接)
    服务器根据收到的字符输出客户连接和离开的
    信息,我写了下面的代码,是一个有MFC支持的程序,为什么
    我运行时程序会像死机一样僵在那,而把这段代码稍改后加到
    一个控制台程序中却能正常显示客户的加入与离开?
            CString msg="Host ";
    CString s1=" join group.";
        CString s2=" leave group.";
    listen( m_TCPSocket, 8 ); while( 1 )
    {
         Accept=accept( m_TCPSocket, (sockaddr*)&client_addr, &clientsize );
    if( Accept == INVALID_SOCKET )
    {
    MessageBox( "Accept connections failed!", "Error!", MB_OK );
                            continue;
    }
    while( (recvmsg=recv( Accept, TCPBuf, sizeof(TCPBuf)-1, 0)) != 0 )
    {
    TCPBuf[recvmsg]='\0';
    if( TCPBuf[0] == 'J' )
    {
    msg=msg+(inet_ntoa(client_addr.sin_addr))+s1;
                                    m_mberlist.AddString(msg);
                                    recvmsg=0;
            break;
    }
    else if( TCPBuf[0] == 'L' )
    {
    msg=msg+(inet_ntoa(client_addr.sin_addr))+s2;
                                    m_mberlist.AddString(msg);
                                    recvmsg=0;
    break;
    }
                    else
    {
                                    recvmsg=0;
    break;
    }
    }
    closesocket( Accept );
    }我写了两个线程,分别是_hThread_Listen和_hThread_Process
    它们的线程函数分别是ThreadFunc_Listen()和ThreadFunc_Proc(),
    这两个线程都在同一个按钮的响应函数中执行
    代码如下:
    void CServerDlg::OnButtonSerstart() 
    {
         ResumeThread( _hThread_Listen );
         ResumeThread( _hThread_Process );
    }ThreadFunc_Listen()
    {
            while(true)
    {
    listen( m_tcpsock, QLEN );
    }
    }
    ThreadFunc_Proc()
    {
         上面那段处理代码…
    }
    可我调试时,程序仍然是僵在
    while(true)
    {
    listen( m_tcpsock, QLEN );
    }
    中,线程不是由系统调度的吗?为什么只执行_hThread_Listen?
    而不执行_hThread_Process?请大家帮我看看有什么问题,我该
    怎么写才能得到想要的结果?