各位大侠,我写了个tcp通信的服务器端和客户端的程序,在服务器端用while(1){accept()}这种形式接收socket,然后每来一个服务就启动一个服务线程,这个while是在主线程中的,在刚开始客户端还没有发数据时,cpu占用很低,可一旦发送完数据,服务器端处于等待时,cpu就上升到100%。我在网上查了查,说“将接受的socket改为非阻塞模式,或者做个超时判定”,如果这样可以的话,可不可以具体说明一下怎样做!谢谢~~ 急用!!!服务器端部分代码如下:
int main()
{
//初始化Winsock2环境
WSADATA WSAData;
if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0)
{
cout<<"Winsock2环境初始化失败!"<<endl;
return (-1);
}
//创建用于侦听的TCP socket
TcpListenSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
//获得本机地址
localAddr=GetLocalIPAddress();
ServerAddr.sin_family               = AF_INET;   
    ServerAddr.sin_port                 = htons(DEF_TCP_PORT);   
    ServerAddr.sin_addr.S_un.S_addr     = inet_addr(localAddr); //绑定TCP侦听端口
if(bind(TcpListenSocket,(sockaddr*)&ServerAddr,sizeof(ServerAddr))==SOCKET_ERROR)
{
cout<<"绑定Tcp侦听端口出现错误!"<<endl;
return (-1);
}
cout<<"绑定侦听端口成功!"<<endl; //监听,准备好接收连接
if (listen(TcpListenSocket,SOMAXCONN)==SOCKET_ERROR)
{
cout<<"Tcp侦听出现错误!"<<endl;
return (-1);
}
    cout<<"正在监听……"<<endl;    SOCKET AcceptSocket;
sockaddr_in AcceptSocketAdr;
    int AptSktAdrLen=sizeof(sockaddr);
int TcpClientCount=0;
while(true)
{
AcceptSocket=accept(TcpListenSocket,(sockaddr*)&AcceptSocketAdr,&AptSktAdrLen);

if(AcceptSocket!=INVALID_SOCKET)
{

//当TCP线程数达到上限,停止接收新的Client
TcpClientCount++;
if(TcpClientCount>MAX_CLIENTS)
{
closesocket(AcceptSocket);
continue;
}
ThreadParam subparam;
subparam.socket=AcceptSocket;
subparam.address=AcceptSocketAdr;
//每获得一个连接后启动TCP服务线程 
HANDLE  subthread;
subthread =  CreateThread(NULL,0,tcpSerThread,&subparam,0,NULL);

}

}
    
closesocket(TcpListenSocket);
WSACleanup();

}

解决方案 »

  1.   

    是accept()阻塞的问题吗?还是因为阻塞在while死循环里?这个已经是多线程了吧!非阻塞能具体讲讲怎么设置吗?谢谢~~
      

  2.   

    非阻塞试了试也是cpu占100%,主要还是死循环的事,查了查“在死循环中如何降低cpu使用”,说Sleep一下就可以,结果真的奏效,已经解决,谢谢大家~~
      

  3.   

    WSAAsyncSelect选择异步方式后,处理FD_ACCEPT消息
      

  4.   

    在While循环里面加多个Sleep(500)试试看!