关于socket编程,cpu使用率100%的问题

BigBlackTree 2011-03-22 09:38:31
最近学socket编程,想做个简单的程序,就是一个服务器三个客户端,但是accept连接第二个客户端时就会cpu100%,程序如下,琢磨一天了也没想明白哪里错了
VOID SocketSrvThread (PVOID pvoid)
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested=MAKEWORD(1,1);
err=WSAStartup(wVersionRequested,&wsaData);
if(err!=0)
{
return;
}
if(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1)
{
WSACleanup();
return;
}
SOCKET socketSrv=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
//绑定套接字
bind(socketSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
//将套接字设置为监听模式,准备接受客户请求
listen( socketSrv, 20 );
while (true)
{
SOCKADDR_IN addrClient[3];
int len=sizeof(SOCKADDR);
int clientNmb=0;
SOCKET socketNmb[CLIENT_NUMBER];
char recvBuf[CLIENT_NUMBER];
while (clientNmb<CLIENT_NUMBER)
{
socketNmb[clientNmb]=accept(socketSrv,(SOCKADDR*)(addrClient+clientNmb),&len);
//////////////////////////////////////////////////////////////////////
//while循环第二次执行accept,就是连接第二个客户端时就会cpu100%///////
///////////////////////////////////////////////////////////////////////

// recv(socketNmb[clientNmb],recvBuf+clientNmb,1,0);
clientNmb++;
}


for (int i=0;i<CLIENT_NUMBER;i++)
{
recv(socketNmb[i],recvBuf+i,1,0);
}

int iTemp=0;
for (int i1=0;i1<CLIENT_NUMBER;i1++)
{
iTemp+=recvBuf[i1];
}
if (iTemp!=150)
{
MessageBox(GetActiveWindow(),"error","error info",MB_OKCANCEL);
}
char sendBuf='1';
for (int i2=0;i2<CLIENT_NUMBER;i2++)
{
send(socketNmb[i2],&sendBuf,1,0);
}
for (int i3=0;i3<CLIENT_NUMBER;i3++)
{
closesocket(socketNmb[i3]);
}

}

}
void CSocketSrvDlg::OnBeginSrv()
{
// TODO: Add your control notification handler code here

_beginthread(SocketSrvThread,0,NULL);
}
...全文
328 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
黑娃 2011-03-22
  • 打赏
  • 举报
回复
也许是你第二次执行到accept的时候,已经没有客户到来了,此时主线程就会一直阻塞在accept处,等待客户的到来,由于你只用了一个线程,界面看起来就像死掉了一样
黑娃 2011-03-22
  • 打赏
  • 举报
回复
我所了解的有关socket编程服务器的模式:
单线程(就像你这个流水作业的)
多线程(一个线程accept,其他线程执行客户任务,加入线程池会好一点)
IO复用(异步的proactor,同步的reactor)

我没看出来你程序的问题,建议你在accept单步调试下
pathuang68 2011-03-22
  • 打赏
  • 举报
回复
主线程accept,当收到客户端的连接请求后,就另外开一个线程,专门处理那个用户的请求。
nickowen 2011-03-22
  • 打赏
  • 举报
回复
accept阻塞掉了,请新开个进程或线程来处理.
主进程或线程只负责监听
子达如何 2011-03-22
  • 打赏
  • 举报
回复
请检查一下accept的返回值,如果accept失败,函数就会立刻返回,而不是等待客户的连接。
bluesky12312388 2011-03-22
  • 打赏
  • 举报
回复
搞不懂你为撒不用多线程来处理。
jngd 2011-03-22
  • 打赏
  • 举报
回复
accept/recv/send判返回值和错误码。

实在不知道就每个for/while加日志
BigBlackTree 2011-03-22
  • 打赏
  • 举报
回复
自己顶一下,关于网络编程谁能给点好的建议,或者把自己的经验,以及开发过程中需要注意的事项说一下也行,我就给分了

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧