各位大侠,我写了个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();
}
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();
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货