<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[运维进行时]]></title> 
<link>https://blog.liuts.com/index.php</link> 
<description><![CDATA[互联网运维与架构]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[运维进行时]]></copyright>
<item>
<link>https://blog.liuts.com/post/206/</link>
<title><![CDATA[实现真实的机柜模拟图[原创]]]></title> 
<author>刘天斯 &lt;liutiansi@gmail.com&gt;</author>
<category><![CDATA[C/C++]]></category>
<pubDate>Fri, 09 Jul 2010 02:42:04 +0000</pubDate> 
<guid>https://blog.liuts.com/post/206/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一般能反映机房设备位置、结构我们都喜欢通过网络拓扑图来展现，但个人感觉还不够直观、明了的表现出自己想要的结果(自己太挑剔了，呵呵)。因此写一个生成真实机柜模拟图平台，实现与真实服务器外观、服务状态、空闲位置等信息。<br/><strong>在线效果图</strong><br/><a href="http://blog.liuts.com/idc/" target="_blank">http://blog.liuts.com/idc/</a><br/><strong>系统截图</strong><br/>1、平台显示某一排截图<br/><a href="https://blog.liuts.com/attachment.php?fid=136" target="_blank"><img src="https://blog.liuts.com/attachment.php?fid=136" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0" width="750"/></a><br/><br/>2、平台显示某台服务器详细信息截图<br/><a href="https://blog.liuts.com/attachment.php?fid=135" target="_blank"><img src="https://blog.liuts.com/attachment.php?fid=135" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0" width="750"/></a><br/><br/>3、状态说明<br/><a href="https://blog.liuts.com/attachment.php?fid=134" target="_blank"><img src="https://blog.liuts.com/attachment.php?fid=134" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>2U服务器正常状态<br/><br/><a href="https://blog.liuts.com/attachment.php?fid=133" target="_blank"><img src="https://blog.liuts.com/attachment.php?fid=133" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>2U服务器当机状态<br/><br/><strong>系统原理</strong><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过获取运维平台的服务器信息(包括位置、操作系统、机型等)，格式为XML，通过c++的tinyxml来解析并渲染成比较美观的HTML格式。当机的信息通过Nagios来获取。这样就可以生成非常人性化的展现平台了：）<br/><br/><strong>系统代码Servermap.cpp</strong><br/><textarea name="code" class="c" rows="15" cols="100">
/***************************************************************************
 *&nbsp;&nbsp; Copyright (C) 2010 by Liu Tiansi&nbsp;&nbsp; *
 *&nbsp;&nbsp; liutiansi@gmail.com&nbsp;&nbsp; *
 *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *
 *&nbsp;&nbsp; This program is free software; you can redistribute it and/or modify&nbsp;&nbsp;*
 *&nbsp;&nbsp; it under the terms of the GNU General Public License as published by&nbsp;&nbsp;*
 *&nbsp;&nbsp; the Free Software Foundation; either version 2 of the License, or&nbsp;&nbsp;&nbsp;&nbsp; *
 *&nbsp;&nbsp; (at your option) any later version.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *
 *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *
 *&nbsp;&nbsp; This program is distributed in the hope that it will be useful,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *
 *&nbsp;&nbsp; but WITHOUT ANY WARRANTY; without even the implied warranty of&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*
 *&nbsp;&nbsp; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.&nbsp;&nbsp;See the&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *
 *&nbsp;&nbsp; GNU General Public License for more details.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*
 *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *
 *&nbsp;&nbsp; You should have received a copy of the GNU General Public License&nbsp;&nbsp;&nbsp;&nbsp; *
 *&nbsp;&nbsp; along with this program; if not, write to the&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *
 *&nbsp;&nbsp; Free Software Foundation, Inc.,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *
 *&nbsp;&nbsp; 59 Temple Place - Suite 330, Boston, MA&nbsp;&nbsp;02111-1307, CN.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *
 ***************************************************************************/


#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include "tinyxml.h"
#include "tinyxml.cpp"
#include "tinystr.h"
#include "tinystr.cpp"
#include "tinyxmlparser.cpp"
#include "tinyxmlerror.cpp"

using namespace std;

class servermap &#123;

&nbsp;&nbsp;public:
&nbsp;&nbsp;&nbsp;&nbsp;servermap( string *serverrow,string _idctype);
&nbsp;&nbsp;&nbsp;&nbsp;~servermap();
&nbsp;&nbsp;&nbsp;&nbsp;string int2str( int num);
&nbsp;&nbsp;&nbsp;&nbsp;void Getdownserver ();
&nbsp;&nbsp;&nbsp;&nbsp;string writefile (string filename);
&nbsp;&nbsp;&nbsp;&nbsp;string GetServerCondition (string ip,string servertype);
&nbsp;&nbsp;&nbsp;&nbsp;string (*displayXmlDocument_info (string filename))[5];
&nbsp;&nbsp;&nbsp;&nbsp;void ProduRow();
&nbsp;&nbsp;&nbsp;&nbsp;void ProduCurrServer();

&nbsp;&nbsp;private:
&nbsp;&nbsp;&nbsp;&nbsp;string idctype;
&nbsp;&nbsp;&nbsp;&nbsp;string (*p_info)[5];&nbsp;&nbsp;// 所有的服务器信息指针(从XML文件中遍历);
&nbsp;&nbsp;&nbsp;&nbsp;string (*pserver_info)[5];&nbsp;&nbsp;// 当前机房的服务器信息指针(从XML文件中遍历);
&nbsp;&nbsp;&nbsp;&nbsp;string ServerInfo[800][5];&nbsp;&nbsp;// 所有的服务器信息数组(从XML文件中遍历);
&nbsp;&nbsp;&nbsp;&nbsp;string ServerInfo_CurrServer[300][5];&nbsp;&nbsp;//当前机房数组，从ServerInfo中过滤出来;
&nbsp;&nbsp;&nbsp;&nbsp;string ServerDownIP[50];&nbsp;&nbsp;&nbsp;&nbsp;//当服务器清单；
&nbsp;&nbsp;&nbsp;&nbsp;int ServerInfoNumber;&nbsp;&nbsp;//获取所有信息的有效行;
&nbsp;&nbsp;&nbsp;&nbsp;string *CurrServer_row;&nbsp;&nbsp;//指向当前机房数组的指针;
&nbsp;&nbsp;&nbsp;&nbsp;int CurrServerInfoNumber;&nbsp;&nbsp;//获取当前机房信息的有效行;
&nbsp;&nbsp;&nbsp;&nbsp;string HTMLstr;&nbsp;&nbsp;&nbsp;&nbsp;//存储HTML串;
&#125;;

//构造func,传入排数及机房类型；
servermap::servermap( string *Serverrow,string _idctype)
&#123;
&nbsp;&nbsp;idctype=_idctype;
&nbsp;&nbsp;//初始化HTML头；
&nbsp;&nbsp;HTMLstr="<html>&#92;n<head>&#92;n<meta http-equiv=&#92;"Content-Type&#92;" content=&#92;"text/html; charset=utf-8&#92;"&nbsp;&nbsp;content=&#92;"5&#92;">&#92;n<title>服务器模拟状态图</title>&#92;n";
&nbsp;&nbsp;HTMLstr+="<script src='/js/server_top.js' language='javascript'></script>&#92;n";
&nbsp;&nbsp;
&nbsp;&nbsp;//机房排数组；
&nbsp;&nbsp;CurrServer_row=Serverrow;
&nbsp;&nbsp;ServerInfoNumber=0;
&nbsp;&nbsp;CurrServerInfoNumber=0;

&nbsp;&nbsp;//获取当前服务器清单；
&nbsp;&nbsp;Getdownserver();

&nbsp;&nbsp;//遍历所有服务器信息；
&nbsp;&nbsp;displayXmlDocument_info("ServerInfoAll.xml");

&nbsp;&nbsp;//简化当前机房服务器清单；
&nbsp;&nbsp;ProduCurrServer();
&#125;

//类虚构func，销毁创建的指针；
servermap::~servermap()
&#123;
&nbsp;&nbsp;//clear mem;
&#125;

//整形转字符串方法；
 string servermap::int2str( int num)
&#123;
&nbsp;&nbsp;&nbsp;&nbsp;if (num == 0 )
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return " 0 ";
&nbsp;&nbsp;&nbsp;&nbsp;string str = "" ;
&nbsp;&nbsp;&nbsp;&nbsp;int num_ = num > 0 ? num : - 1 * num;

&nbsp;&nbsp;&nbsp;&nbsp;while (num_)
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str = ( char )(num_ % 10 + 48 ) + str;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; num_ /= 10 ;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;

&nbsp;&nbsp;&nbsp;&nbsp;if (num < 0 )
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str = " - " + str;
&nbsp;&nbsp;&nbsp;&nbsp;return str;
&#125;

//返回服务器状态图片；
string servermap::GetServerCondition (string ip,string servertype)
&#123;
&nbsp;&nbsp;bool Obtaining=false;
&nbsp;&nbsp;for (int i=0;i<50;i++)
&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;if (ServerDownIP[i]==ip)
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Obtaining=true;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&#125;

&nbsp;&nbsp;if (servertype=="1U")
&nbsp;&nbsp;if (Obtaining)
&nbsp;&nbsp;&nbsp;&nbsp;return "1u_down.gif";
&nbsp;&nbsp;else return "1u_normal.gif";

&nbsp;&nbsp;if (servertype=="2U")
&nbsp;&nbsp;if (Obtaining)
&nbsp;&nbsp;&nbsp;&nbsp;return "2u_down.gif";
&nbsp;&nbsp;else return "2u_normal.gif";

&nbsp;&nbsp;if (servertype=="6U")
&nbsp;&nbsp;if (Obtaining)
&nbsp;&nbsp;&nbsp;&nbsp;return "ta_down.gif";
&nbsp;&nbsp;else return "ta_normal.gif";
&#125;

//获取当机服务器清单，从文件中获取；
void servermap::Getdownserver()
&#123;
&nbsp;&nbsp;string mainpath="/ServerDownlist";
&nbsp;&nbsp;string ip;
&nbsp;&nbsp;ifstream FileObject;
&nbsp;&nbsp;FileObject.open(mainpath.c_str(),ios::in);
&nbsp;&nbsp;int i=0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(getline(FileObject,ip))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;ServerDownIP[i]=ip;
&nbsp;&nbsp;&nbsp;&nbsp;i+=1;
&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp; FileObject.close();
&#125;

//写配置文件方法，形参为文件名；
string servermap::writefile(string filename)
&#123;
&nbsp;&nbsp;string mainpath="/www/webroot/"+filename;
&nbsp;&nbsp;ofstream FileObject;
&nbsp;&nbsp;FileObject.open(mainpath.c_str(),ios::out);
&nbsp;&nbsp;FileObject<<HTMLstr<<endl;
&nbsp;&nbsp;&nbsp;&nbsp; FileObject.close();
&nbsp;&nbsp;return "1";
&#125;


//获取XML文件服务器信息数据到指针；
string (* servermap::displayXmlDocument_info(string filename))[5]
&#123;
&nbsp;&nbsp;TiXmlDocument doc(filename.c_str());
&nbsp;&nbsp;doc.LoadFile();
&nbsp;&nbsp;TiXmlElement *root_r = doc.RootElement();
&nbsp;&nbsp;//static vector<vector<string> > ClassInfo(m,vector<string>(n));
&nbsp;&nbsp;int i=0;
&nbsp;&nbsp;for(TiXmlNode *node = root_r->FirstChild(); node; node = node->NextSibling())
&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;//输出元素节点名称;
&nbsp;&nbsp;&nbsp;&nbsp;//cout << node->Value() << endl;

&nbsp;&nbsp;&nbsp;&nbsp;//遍历输出节点属性名称及值;
&nbsp;&nbsp;&nbsp;&nbsp;if (node->Type() == TiXmlNode::ELEMENT)
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(TiXmlAttribute *attr = node->ToElement()->FirstAttribute(); attr; attr = attr->Next())
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout << "&nbsp;&nbsp;&nbsp;&nbsp;" << attr->Name() << " =: " << attr->Value() << endl;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;//遍历输出子节点名称及值;
&nbsp;&nbsp;&nbsp;&nbsp;TiXmlNode *child = node->FirstChild();
&nbsp;&nbsp;&nbsp;&nbsp;int j=0;
&nbsp;&nbsp;&nbsp;&nbsp;while(child)
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int type = child->Type();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (type == TiXmlNode::ELEMENT)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServerInfo[i][j]=child->ToElement()->GetText();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;child = node->IterateChildren(child);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j+=1;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;i+=1;

&nbsp;&nbsp;&#125;
&nbsp;&nbsp;ServerInfoNumber=i;
&nbsp;&nbsp;p_info=ServerInfo;
&nbsp;&nbsp;//free(ClassInfo);
&#125;

//生成当前机房数组;
void servermap::ProduCurrServer()
&#123;
&nbsp;&nbsp;const char * strtmp;
&nbsp;&nbsp;string strswap,stradd,Position0,Position1,Position2,Position3;

&nbsp;&nbsp;for (int i=0;i<10;i++)
&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;if (CurrServer_row[i]=="")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;for (int j=0;j<ServerInfoNumber;j++)
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strswap=*(*(p_info+j)+3);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strtmp=strswap.c_str();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Position0=strtmp[0];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Position1=strtmp[1];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Position2=strtmp[2];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Position3=strtmp[3];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (idctype=="idc")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stradd=Position0+Position1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stradd=Position0+Position1+Position2+Position3;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (stradd==CurrServer_row[i])
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CurrServerInfoNumber+=1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServerInfo_CurrServer[CurrServerInfoNumber][0]=*(*(p_info+j)+0);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServerInfo_CurrServer[CurrServerInfoNumber][1]=*(*(p_info+j)+1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServerInfo_CurrServer[CurrServerInfoNumber][2]=*(*(p_info+j)+2);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServerInfo_CurrServer[CurrServerInfoNumber][3]=*(*(p_info+j)+3);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServerInfo_CurrServer[CurrServerInfoNumber][4]=*(*(p_info+j)+4);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&#125;
&nbsp;&nbsp;pserver_info=ServerInfo_CurrServer;
&#125;

//生成服务器拓扑状态图；
void servermap::ProduRow()
&#123;
&nbsp;&nbsp;string point_moddle_key="-0";
&nbsp;&nbsp;string point_moddle="";
&nbsp;&nbsp;string point_last="";
&nbsp;&nbsp;string point_all="";
&nbsp;&nbsp;string substrServer="";
&nbsp;&nbsp;string DIVstr="";
&nbsp;&nbsp;int allservercount=0;
&nbsp;&nbsp;//所有机柜循环体;
&nbsp;&nbsp;for (int i=0;i<10;i++)
&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;if (CurrServer_row[i]=="")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;

&nbsp;&nbsp;&nbsp;&nbsp;//当前排循环体;
&nbsp;&nbsp;&nbsp;&nbsp;if (idctype=="idc")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTMLstr+="<div align=center>"+CurrServer_row[i].substr(0,2)+"排</div>&#92;n";
&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTMLstr+="<div align=center>"+CurrServer_row[i].substr(2,2)+"排</div>&#92;n";
&nbsp;&nbsp;&nbsp;&nbsp;HTMLstr+="<table width='1024' border='0' cellpadding='1' cellspacing='3' bgcolor='#ffffff' class='jjtable'>&#92;n";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTMLstr+="<tr align='center' valign='top'>&#92;n";

&nbsp;&nbsp;&nbsp;&nbsp;for (int j=1;j<=7;j++)
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;point_moddle=point_moddle_key+int2str(j);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTMLstr+="<td width='147' bgcolor='#eeeeee' background=&#92;"/images/serverico/jg.gif&#92;" >&#92;n";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//HTMLstr+="<td width='147' style=&#92;"BACKGROUND: url(/images/serverico/jg.gif) #edf6fb repeat-y 0px 0px;&#92;">&#92;n"&nbsp;&nbsp;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTMLstr+="<table width='99%' height='440'&nbsp;&nbsp;border='0' cellpadding='1' cellspacing='0'>&#92;n";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTMLstr+="<tr>&#92;n";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTMLstr+="&nbsp;&nbsp;<td height='30' align='center' valign='bottom'&nbsp;&nbsp;class='jgtable'><font class=jgtitle>0"+int2str(j)+"</font></td></tr>&#92;n";

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//当前列循环体;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int k=1;k<=10;k++)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (k==10)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;point_last="-10";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;point_last=point_moddle_key+int2str(k);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;point_all=CurrServer_row[i]+point_moddle+point_last;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTMLstr+="<tr>&#92;n";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTMLstr+="&nbsp;&nbsp;<td height='30' align='center' valign='bottom' class='jgtable'>&#92;n";

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int m=0;m<=CurrServerInfoNumber;m++)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//过滤空元素；
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//cout<<point_all<<"=="<<*(*(pserver_info+j)+3)<<endl;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;substrServer=*(*(pserver_info+m)+3);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (idctype=="idc")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;substrServer=substrServer.substr(0,8);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;substrServer=substrServer.substr(0,10);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (point_all==substrServer)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DIVstr+="IP:"+*(*(pserver_info+m)+0)+"<br/>";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DIVstr+="操作系统:"+*(*(pserver_info+m)+2)+"<br/>";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DIVstr+="位置:"+*(*(pserver_info+m)+3)+"<br/>";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DIVstr+="机型:"+*(*(pserver_info+m)+4)+"<br/>";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (*(*(pserver_info+m)+4)=="1U")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTMLstr+="<img src='/images/serverico/"+GetServerCondition(*(*(pserver_info+m)+0),"1U")+"' width='127' height='12' style=&#92;"vertical-align:bottom;&#92;" onmouseover=&#92;"displayDIV('operate"+int2str(allservercount)+"'); return false&#92;" onmouseout=&#92;"hiddenDIV('operate"+int2str(allservercount)+"'); return false&#92;">";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if (*(*(pserver_info+m)+4)=="2U")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTMLstr+="<img src='/images/serverico/"+GetServerCondition(*(*(pserver_info+m)+0),"2U")+"' width='127' height='24' style=&#92;"vertical-align:bottom;&#92;" onmouseover=&#92;"displayDIV('operate"+int2str(allservercount)+"'); return false&#92;" onmouseout=&#92;"hiddenDIV('operate"+int2str(allservercount)+"'); return false&#92;">";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;HTMLstr+="<img src='/images/serverico/"+GetServerCondition(*(*(pserver_info+m)+0),"6U")+"'&nbsp;&nbsp;height='76' style=&#92;"vertical-align:bottom;&#92;" onmouseover=&#92;"displayDIV('operate"+int2str(allservercount)+"'); return false&#92;" onmouseout=&#92;"hiddenDIV('operate"+int2str(allservercount)+"'); return false&#92;">";

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTMLstr+="<div id=&#92;"operate"+int2str(allservercount)+"&#92;" style=&#92;"filter:Alpha(opacity=90);display:none;position:absolute; width:200px;BORDER-RIGHT: 2px outset; BORDER-TOP: 1px outset; BACKGROUND: #ffffff; BORDER-LEFT: 1px outset; BORDER-BOTTOM: 2px outset; text-align:left;&#92;"><table cellpadding=&#92;"3&#92;" cellspacing=&#92;"1&#92;"><tr><td>"+DIVstr+"</td></tr></table></div>&#92;n";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;allservercount+=1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DIVstr="";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTMLstr+="&nbsp</td>&#92;n";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTMLstr+="&nbsp;&nbsp;</tr>&#92;n";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTMLstr+=" </table>&#92;n";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTMLstr+="</td>&#92;n";

&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;HTMLstr+="</tr>&#92;n";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTMLstr+="</table>&#92;n";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTMLstr+="<p> </p>&#92;n";
&nbsp;&nbsp;&#125;
&nbsp;&nbsp;HTMLstr+="<script src='/js/server_down.js' language='javascript'></script>&#92;n";
&#125;

//类入 口main()，接受用户参数；
int main()
&#123;
&nbsp;&nbsp;string * row;
&nbsp;&nbsp;string idctype="";

&nbsp;&nbsp;//定义机柜排号;
&nbsp;&nbsp;string IDCA[10]=&#123;"01","02","03","04","05","06"&#125;;
&nbsp;&nbsp;string IDCC[10]=&#123;"18","19","20"&#125;;

&nbsp;&nbsp;
&nbsp;&nbsp;//IDC A
&nbsp;&nbsp;idctype="idc";
&nbsp;&nbsp;row=IDCA;
&nbsp;&nbsp;servermap appa(row,idctype);
&nbsp;&nbsp;appa.ProduRow();
&nbsp;&nbsp;appa.writefile("idca.html");
&nbsp;&nbsp;//IDC C
&nbsp;&nbsp;idctype="idc";
&nbsp;&nbsp;row=IDCC;
&nbsp;&nbsp;servermap appc(row,idctype);
&nbsp;&nbsp;appc.ProduRow();
&nbsp;&nbsp;appc.writefile("idcc.html");

&nbsp;&nbsp;//free(p);
&nbsp;&nbsp;return 0;
&#125;
</textarea><br/><strong>XML数据格式</strong><br/><textarea name="code" class="xml" rows="15" cols="100">
<?xml version="1.0" ?><wml>
<serverinfo>
&nbsp;&nbsp;<ip>192.168.0.1</ip>
&nbsp;&nbsp;<classid>18</classid>
&nbsp;&nbsp;<os>windows-server</os>
&nbsp;&nbsp;<locate>CC06-05-08</locate>
&nbsp;&nbsp;<body&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type>6U</bodytype>
</serverinfo>
<serverinfo>
&nbsp;&nbsp;<ip>192.168.0.2</ip>
&nbsp;&nbsp;<classid>19</classid>
&nbsp;&nbsp;<os>linux-server</os>
&nbsp;&nbsp;<locate>CC06-05-07-R</locate>
&nbsp;&nbsp;<body&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type>6U</bodytype>
</serverinfo>
<serverinfo>
&nbsp;&nbsp;<ip>192.168.0.3</ip>
&nbsp;&nbsp;<classid>20</classid>
&nbsp;&nbsp;<os>windows-server</os>
&nbsp;&nbsp;<locate>CC06-04-07</locate>
&nbsp;&nbsp;<body&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type>6U</bodytype>
</serverinfo>
</wml>
</textarea><br/><br/>如大家有什么疑问或感兴趣的话题可以通过weibo与我交流：<a href="http://t.qq.com/yorkoliu" target="_blank">http://t.qq.com/yorkoliu</a><br/>Tags - <a href="https://blog.liuts.com/tags/%25E6%25A8%25A1%25E6%258B%259F%25E6%259C%25BA%25E6%259F%259C/" rel="tag">模拟机柜</a> , <a href="https://blog.liuts.com/tags/c%252B%252B/" rel="tag">c++</a>
]]>
</description>
</item><item>
<link>https://blog.liuts.com/post/206/#blogcomment95</link>
<title><![CDATA[[评论] 实现真实的机柜模拟图[原创]]]></title> 
<author>forget &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Sat, 10 Jul 2010 17:43:15 +0000</pubDate> 
<guid>https://blog.liuts.com/post/206/#blogcomment95</guid> 
<description>
<![CDATA[ 
	太牛B了，关注ing
]]>
</description>
</item><item>
<link>https://blog.liuts.com/post/206/#blogcomment96</link>
<title><![CDATA[[评论] 实现真实的机柜模拟图[原创]]]></title> 
<author>lilib &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Sun, 11 Jul 2010 11:56:31 +0000</pubDate> 
<guid>https://blog.liuts.com/post/206/#blogcomment96</guid> 
<description>
<![CDATA[ 
	刘老大一出手必是精品，呵呵。
]]>
</description>
</item><item>
<link>https://blog.liuts.com/post/206/#blogcomment106</link>
<title><![CDATA[[评论] 实现真实的机柜模拟图[原创]]]></title> 
<author>路人甲 &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Sat, 24 Jul 2010 03:25:28 +0000</pubDate> 
<guid>https://blog.liuts.com/post/206/#blogcomment106</guid> 
<description>
<![CDATA[ 
	咦我怎么看把HTML代码封装到了C++里面了。为啥不把UI的东西拿出来呢？现在不是提倡所谓MVC分层设计理念嘛。
]]>
</description>
</item><item>
<link>https://blog.liuts.com/post/206/#blogcomment466</link>
<title><![CDATA[[评论] 实现真实的机柜模拟图[原创]]]></title> 
<author>一路狂飙 &lt;mching.08@gmail.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 11 Nov 2010 06:31:19 +0000</pubDate> 
<guid>https://blog.liuts.com/post/206/#blogcomment466</guid> 
<description>
<![CDATA[ 
	小弟看了佩服的五体投地！佩服，佩服！
]]>
</description>
</item><item>
<link>https://blog.liuts.com/post/206/#blogcomment506</link>
<title><![CDATA[[评论] 实现真实的机柜模拟图[原创]]]></title> 
<author>ltjong &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Wed, 01 Dec 2010 01:02:14 +0000</pubDate> 
<guid>https://blog.liuts.com/post/206/#blogcomment506</guid> 
<description>
<![CDATA[ 
	感谢分享！<br/>按README编译时总提示/home/liuts/xxxxx，然后看了一下有太多地方有这个了，没有一个配置文件可以更改的吗？<br/><br/>编译出servermap后不能用./servermap 运行？<br/><br/>请帮助，谢谢
]]>
</description>
</item><item>
<link>https://blog.liuts.com/post/206/#blogcomment668</link>
<title><![CDATA[[评论] 实现真实的机柜模拟图[原创]]]></title> 
<author>sinorain &lt;admin@sinorian.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 21 Apr 2011 09:42:09 +0000</pubDate> 
<guid>https://blog.liuts.com/post/206/#blogcomment668</guid> 
<description>
<![CDATA[ 
	我在安装编译时也是提示/home/liuts/xxxxx&nbsp;&nbsp; 这个错误。
]]>
</description>
</item><item>
<link>https://blog.liuts.com/post/206/#blogcomment978</link>
<title><![CDATA[[评论] 实现真实的机柜模拟图[原创]]]></title> 
<author>yutaka &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Mon, 07 Nov 2011 05:55:20 +0000</pubDate> 
<guid>https://blog.liuts.com/post/206/#blogcomment978</guid> 
<description>
<![CDATA[ 
	刘兄你好，请问ServerMap1.1版本在哪里下载？？多谢
]]>
</description>
</item><item>
<link>https://blog.liuts.com/post/206/#blogcomment2455</link>
<title><![CDATA[[评论] 实现真实的机柜模拟图[原创]]]></title> 
<author>铝塑板 &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 31 Jul 2014 13:18:12 +0000</pubDate> 
<guid>https://blog.liuts.com/post/206/#blogcomment2455</guid> 
<description>
<![CDATA[ 
	太牛B了，谢谢分享
]]>
</description>
</item><item>
<link>https://blog.liuts.com/post/206/#blogcomment2585</link>
<title><![CDATA[[评论] 实现真实的机柜模拟图[原创]]]></title> 
<author>o &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Wed, 08 Apr 2015 03:32:10 +0000</pubDate> 
<guid>https://blog.liuts.com/post/206/#blogcomment2585</guid> 
<description>
<![CDATA[ 
	怎么实现自动检测宕机呢？
]]>
</description>
</item><item>
<link>https://blog.liuts.com/post/206/#blogcomment2594</link>
<title><![CDATA[[评论] 实现真实的机柜模拟图[原创]]]></title> 
<author>beijixiaolan &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Sat, 09 May 2015 07:14:26 +0000</pubDate> 
<guid>https://blog.liuts.com/post/206/#blogcomment2594</guid> 
<description>
<![CDATA[ 
	请问ServerMap1.1版本在哪里下载，网上没找到，谢谢
]]>
</description>
</item>
</channel>
</rss>