设为首页 加入收藏

TOP

Linux下用C实现Ping监测与HTTP报文上传(一)
2014-11-23 19:56:35 来源: 作者: 【 】 浏览:58
Tags:Linux 下用 实现 Ping 监测 HTTP 报文 上传

  有一个数据中心监测项目,命名为CPing,它的主要原理通过WEB进行前台统一配置管理,后台定期对数据中心相关设备执行Ping操作,并将结果及时写入到数据库


  该项目基于Linux平台部署,前端开发语言采用PHP,后台开发语言采用C,由于考量到项目的部署简洁性,后台开发的守护进程尽量不直接操作数据库,而是将需要写入的数据以HTTP的形式发送给PHP的WEB页面,由PHP完成写入操作。这样的好处是后台守护进程部署时不需要配置相关数据库接入环境。


  下面给出一段后台代码,作用是执行Ping操作,并将结果封装成HTTP报文发送至WEB端。


//---------------------------------------------------------
// HTTPSinge.c ./http www.ifeng.com 0/1 80 127.0.0.1 80
// 用于执行HTTP命令,并将结果通过HTTP GET方式传至WEB数据库
// my2005lb 2013-8-3
//
//---------------------------------------------------------
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include


char* URLTOIP(char *argv)
{
struct hostent *h;
if((h=gethostbyname(argv))==NULL)
{
fprintf(stderr,"不能得到IP/n");
exit(1);
}
printf("HostName :%s/n",h->h_name);
printf("IP Address :%s/n",inet_ntoa(*((struct in_addr *)h->h_addr)));
return inet_ntoa(*((struct in_addr *)h->h_addr));
}
// 执行PING 操作
int HTTPScan(char *argv,int nPort,int nType,double *pRet)
{
struct sockaddr_in serverAddr;
int clientSocket;
int nCount = 0;
char sendbuf[2000];
char recvbuf[2000];
if((clientSocket=socket(AF_INET,SOCK_STREAM,0)) < 0)
return -1;

serverAddr.sin_family=AF_INET;
serverAddr.sin_port=htons(nPort);
printf("%s\n",URLTOIP(argv));
serverAddr.sin_addr.s_addr=inet_addr(URLTOIP(argv));
if(connect(clientSocket,( struct sockaddr * )&serverAddr,sizeof(serverAddr)) < 0)
return -1;


//printf("%s\n",sendbuf);
sprintf(sendbuf,"HEAD http://%s/ HTTP/1.1\r\nHOST: %s\r\nCONNECTION: CLOSED\r\n\r\n",argv,argv);


send(clientSocket,sendbuf,strlen(sendbuf),0);
recv(clientSocket,recvbuf,sizeof(recvbuf),0);
printf("%s\n",recvbuf);
close(clientSocket);
return nCount;
}
// 执行向远程数据中心上报数据
int ProcessSQLUpdate(char *strURL,char *strIP,int nPort,char *sendbuf)
{
struct sockaddr_in serverAddr;
int clientSocket;
char recvbuf[2000];
if((clientSocket=socket(AF_INET,SOCK_STREAM,0)) < 0)
return -1;

serverAddr.sin_family=AF_INET;
serverAddr.sin_port=htons(nPort);
serverAddr.sin_addr.s_addr=inet_addr(strIP);
if(connect(clientSocket,( struct sockaddr * )&serverAddr,sizeof(serverAddr)) < 0)
return -1;


//printf("%s\n",sendbuf);
send(clientSocket,sendbuf,strlen(sendbuf),0);
recv(clientSocket,recvbuf,sizeof(recvbuf),0);
//printf("%s\n",recvbuf);
close(clientSocket);
return 0;
}
int main(int argc,char *argv[])
{
char strIP[250];
int nIPPort = 80;
char strURL[250];
int nPort = 80;
double pRet[6];
int nType=0;
int nCount = 0;
char sendbuf[2000];


if(argc != 6) return 0;
// ./http www.sina.com.cn 1/0 80 127.0.0.1 80(1为HTTPS,0为HTTP)
// url
if(strlen(argv[1]) > 0 && strlen(argv[1]) < 200)
sprintf(strURL,"%s",argv[1]);
else
return 0;

// http https
if(strlen(argv[2]) > 0 && strlen(argv[2]) < 2)
nType = atoi(argv[2]);
else
return 0;


// scan port
if(strlen(argv[3]) > 0 && strlen(argv[3]) < 6)
nIPPort = atoi(argv[3]);
else
return 0;


// ip
if(strlen(argv[4]) > 0 && strlen(argv[4]) < 160)
sprintf(strIP,"%s",argv[4]);
else
sprintf(strIP,"127.0.0.1");


if(strlen(argv[5]) > 0 && strlen(argv[5]) <= 5)
nPort = atoi(argv[5]);
printf("%s %d %d %s %d\n",strIP,nIPPort,nType,strURL,nPort);


// process ping
nCount = HTTPScan(strURL,nIPPort,nType,pRet);


if(nCount == 2)
sprintf(sendbuf,"GET http://%s/CPing/update/http.php name=%s&lost=%

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Java反射机制实例 下一篇Java对象序列化

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: