小弟问cpu使用率和socket编程的一点有关问题

小弟问cpu使用率和socket编程的一点问题
问题1,TCP连接时,我客户端用m_nLinked = connect(m_socket,(SOCKADDR*)&m_peerAddr,sizeof(SOCKADDR));连接服务器。并用SetTimer()定时给服务器端发送客户端的CPU和内存使用情况。这是在客户端显示状态为连接。但如果服务器端关了,我客户端怎么知道?需要服务器端给客户端发消息说服务器已关吗?还是有什么办法检测服务器已关?我试过connect, select都不行,不知为什么。

问题2,我获得cup使用率的方法如下
  1, 取出系统中cpu个数;  
   
  2, 取出当前系统时间,减去原来保存的系统时间,得出从上次取值到目前的系统时间差;  
   
  3, 取出系统当前空闲时间,减去原来保存的空闲时间,得出这个时间段空闲时间  
   
  4, 用这个时间段空闲时间除以系统时间,得出这段时间系统的cpu空闲率  
   
  5, 用100-(系统的空闲率)/(cpu个数)所得的值就是cpu占有率  
但发现某几个机子在某种非常特殊的情况下,这个使用率是负值,这是怎么回事?

请做过的帮忙,分不够可以加。

------解决方案--------------------
1、如果服务器端关了, 客户端recv或send会收到-1,或用下面的我用了几百年的判断套接字是否有效的函数。

BOOL Socket_HasConnectionDropped(int i_sd)
{
BOOL bConnDropped = FALSE;
INT iRet = 0;
BOOL bOK = TRUE;

if (i_sd == INVALID_SOCKET)
return TRUE;

struct timeval timeout = { 0, 0 };
fd_set readSocketSet;

FD_ZERO(&readSocketSet);
FD_SET(i_sd, &readSocketSet);

iRet = ::select(0, &readSocketSet, NULL, NULL, &timeout);
bOK = (iRet > 0);

if(bOK)
{
bOK = FD_ISSET(i_sd, &readSocketSet);
}

if(bOK)
{
CHAR szBuffer[1] = "";
iRet = ::recv(i_sd, szBuffer, 1, MSG_PEEK);
bOK = (iRet > 0);
if(!bOK)
{
INT iError = ::WSAGetLastError();
bConnDropped = (( iError == WSAENETRESET) ||
(iError == WSAECONNABORTED) ||
(iError == WSAECONNRESET) ||
(iError == WSAEINVAL) ||
(iRet == 0));
}
}
return(bConnDropped);
}
------解决方案--------------------
问题1:如果你用select在检测你的客户端的SOCKET,那么如果服务器正常的调用了closesocket把你关掉了,那么你的select会返回,并且FD_WRITE的fdset可读,并且可如果可读长度为0,表明断开了。
问题2:cpu的利用率使用以下方法:
FILETIME kernelTime;
FILETIME userTime;
FILETIME creationTime;
FILETIME exitTime;
if(GetProcessTimes(hProcess,&creationTime,
&exitTime,&kernelTime,&userTime)){

FILETIME result = CTimeOperation::Add(kernelTime,userTime);
SYSTEMTIME sysTime;
if(FileTimeToSystemTime(&result, &sysTime)){
char buf[9] = {0};
memset(buf,0,sizeof(buf));
sprintf(buf,"%02d%02d%02d",sysTime.wHour,sysTime.wMinute,sysTime.wSecond);
proc_data._cpu_time = atol(buf);
}

if(FileTimeToSystemTime(&creationTime, &sysTime)){
char buf[20] = {0};
memset(buf,0,sizeof(buf));
sprintf(buf,"%02d%02d%02d%02d",
sysTime.wDay,
sysTime.wHour,sysTime.wMinute,sysTime.wSecond);
proc_data._creation_time = atol(buf);
}

return true;

}
------解决方案--------------------
1、根据send和recv的返回值可以判断,返回值小于等于0,则说明连接已经断开或者出现了错误。
2、调试看看是系统时间差还是空闲时间差小于0。另外注意系统时间是可以调整的。