客户端发来连接请求,服务器端没有显示“请求已连接”,但是客户端显示了连接成功~这是为什么?
        
        DWORD m;//线程退出代码 timeval tv;
tv.tv_sec=0;
tv.tv_usec=0;
fd_set fdread;
FD_ZERO(&fdread);
FD_SET(sListen,&fdread); while (1)
{ GetExitCodeThread(handle,&m);//退出码
if (CutListenThread==1)//通过外部全局变量控制线程退出
{
AfxMessageBox("监听线程终止");
::ExitThread(m);

//break;
}

int len = sizeof(cli);
select(0,&fdread,NULL,NULL,&tv);

if (FD_ISSET(sListen,&fdread))
{

sAccept = accept(sListen,(struct sockaddr* )&cli,&len);

if (sAccept==INVALID_SOCKET)
{
int error5 = WSAGetLastError();
CString error5_str5;
error5_str5.Format("%d",error5);
AfxMessageBox("接受连接错误,错误代码:"+error5_str5); return 1; }
                        AfxMessageBox("请求已连接"); CreateThread(NULL,0,DataThread,(LPVOID)sAccept,0,NULL);
}

Sleep(100);
}

return 0;
}

解决方案 »

  1.   

    在线程中别用AfxMessageBox,可能弹不出窗口。你试着加断点调试就知道连接是否成功了。
      

  2.   

    如果要用AfxMessageBox,线程需要用AfxBeginThread创建,都用Afx函数或者都不用Afx函数。
      

  3.   

    我调试一下但就算afxmessagebox没有弹出,,,最后创建了一个线程用来交换数据,,,但没有增加线程~这是为什么呢?
      

  4.   

    经过调试发现,客户端发来请求服务器端不会执行这句 sAccept = accept(sListen,(struct sockaddr* )&cli,&len);
      

  5.   

    没有进if,,,截至到if时而且sListen返回值为1848~~
      

  6.   

    楼主好好看看select的用法select是一定要检查返回值的,因为你设置了超时tv
        err = select(0,&fdread,NULL,NULL,&tv);
        if ( err < 1 )
        {
            continue;
        }
      

  7.   

    客户端部分代码:

            //服务器端地址
    sockaddr_in serveraddr; UpdateData(TRUE);
    serveraddr.sin_family=AF_INET;
    serveraddr.sin_port=htons(m_port);
    serveraddr.sin_addr.S_un.S_addr=inet_addr(m_IP); if(connect(m_client,(sockaddr*)&serveraddr,sizeof(serveraddr))!=0){
    int i = WSAGetLastError();
    MessageBox("连接失败");
    return;

    }
    else
    MessageBox("连接成功");
      

  8.   

    有连接时err是-1,无连接时err是0
      

  9.   

    还有,第一次select返回0 第二次,第三次就返回-1了,这是为什么呢?