Linux下用C实现Ping监测与HTTP报文上传

标签: linux ping http | 发表时间:2014-10-12 06:14 | 作者:my2005lb
出处:http://blog.csdn.net

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

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

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

<span xmlns="http://www.w3.org/1999/xhtml" style="">//---------------------------------------------------------
//  HTTPSinge.c ./http www.ifeng.com  0/1 80 127.0.0.1 80 
// 用于执行HTTP命令,并将结果通过HTTP GET方式传至WEB数据库
//       my2005lb 2013-8-3
//
//---------------------------------------------------------
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

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=%f HTTP/1.1\r\nHOST: %s\r\nCONNECTION: CLOSED\r\n\r\n",strIP,strURL,pRet[1],strIP); 
	else if(nCount == 6)
		sprintf(sendbuf,"GET http://%s/CPing/update/http.php?name=%s&lost=%f&avg=%f HTTP/1.1\r\nHOST: %s\r\nCONNECTION: CLOSED\r\n\r\n",strIP,strURL,pRet[1],pRet[3],strIP); 
	else 
		sprintf(sendbuf,"GET http://%s/CPing/update/http.php?name=%s&lost=-1&lost=-1 HTTP/1.1\r\nHOST: %s\r\nCONNECTION: CLOSED\r\n\r\n",strIP,strURL,strIP); 

//	ProcessSQLUpdate(strURL,strIP,nPort,sendbuf);
	/*
		printf("Min Value: %f\n",pRet[2]);
		printf("Avg Value: %f\n",pRet[3]);
		printf("Max Value: %f\n",pRet[4]);
		printf("MDev Value: %f\n",pRet[5]);
	*/
	return 0;
}</span>


作者:my2005lb 发表于2014-10-11 22:14:27 原文链接
阅读:108 评论:0 查看评论

相关 [linux ping http] 推荐:

Linux下用C实现Ping监测与HTTP报文上传

- - CSDN博客系统运维推荐文章
     有一个数据中心监测项目,命名为CPing,它的主要原理通过WEB进行前台统一配置管理,后台定期对数据中心相关设备执行Ping操作,并将结果及时写入到数据库.   该项目基于Linux平台部署,前端开发语言采用PHP,后台开发语言采用C,由于考量到项目的部署简洁性,后台开发的守护进程尽量不直接操作数据库,而是将需要写入的数据以HTTP的形式发送给PHP的WEB页面,由PHP完成写入操作.

Linux「真」全局 HTTP 代理方案

- - 依云's Blog
本文来自 依云's Blog,转载请注明. 看到 ArchWiki 上 GoAgent 条目的 亚全局代理方案,只是设置了代理相关环境变量. 我就想,为什么不实现一个真正的全局 HTTP 代理呢. 最终,答案是:Linux 太灵活了,以至于想写一个脚本来搞定很麻烦. 不过方案如下,有兴趣的可以折腾折腾.

linux 下如何抓取HTTP流量包

- - 运维生存时间
基于某些原因你需要嗅探HTTP Web流量(即HTTP请求和响应). 例如,你可能会测试Web服务器的性能,或者x奥uy调试Web应用程序或RESTful服务 ,又或者试图解决PAC(代理自动配置)问题,或检查从网站上下载的任何恶意文件. 甭管是什么原因,对于系统管理员,开发人员,甚至是最终用户,嗅探HTTP流量是非常有帮助的.

linux高可用集群heartbeat实现http的高可用

- - CSDN博客系统运维推荐文章
    linux高可用集群的种类很多,比如常见的heartbeat,corosync,rhcs,keepalived,这些集群软件的出现为我们的业务生产环境提供了高可用的保证,本文将简单介绍一下用heartbeat的v2版本来处理一个简单的http高可用集群的搭建.     在实现http高可用集群之前,首先至少需要2台主机,并且需要做3点基本的准备工作:.

linux下查看http 并发和 tcp连接数

- - 操作系统 - ITeye博客
linux查看httpd进程数. 查看Apache的并发请求数及其TCP连接状态. (这条语句是从新浪互动社区事业部技术总监王老大那儿获得的,非常不错). 其中的SYN_RECV表示正在等待处理的请求数;ESTABLISHED表示正常数据传输状态;TIME_WAIT表示处理完毕,等待超时结束的请求数.

几个提供在线 ping 的网站

- - 嘉佑中文博客
使用国外虚拟主机或者租用独立服务器又或者主机托管,由于物理距离上的限制,无法知道网站的访客访问的速度如何. 这时候需要借助别的一些提供在线 ping 服务的网站,下面是几个做的不错的,仅供自己收藏. 从名字都能看出来,Just-ping 只提供 ping 服务,数据来自他们在全球设置的 50 个服务器.

在交换机上ping某IP地址出现(DUP!)现象

- - 天空极速
重复DUPLICATE,同一个序号的ICMP包却收到了多个回应. 一般在PING网段广播地址才会出现这种情况,但这里的地址应该不是广播地址,为什么. 1、远端交换机或HUB流量超过负载,即堵塞;重启交换机或者HUB解决. 这种情况很难得.除非有恶意的行为.故意不回复IP冲突检测的包. Duplicates may occur in many situations and are rarely (if ever) a good sign, although the presence of low levels of duplicates may not always be cause for alarm.

12306抢票攻略:抢票插件 + Host刷低PING

- - 互联网的一些事-关注互联网产品管理,交流产品设计、用户体验心得
  春运又要来了,经过双11、双12、圣诞节的秒杀洗礼,大家的手速肯定快了不少吧,不过这次可是春运,压力绝对不比双12秒到大额红包的概率小,之前还能通过抢票器抢票,后来12306偷师度娘,放出了万恶的神兽——验证马,顿时举国一片哀嚎,不过这次,我通过最新的抢票插件和Host刷低PING的办法,成功帮几个同事抢到车票,趁这段时间空空,就上来给大家播一段,献丑,献丑,呵呵.

HTTP Headers 入门

- johnny - Time Machine
非常感谢 @ytzong 同学在twitter上推荐这篇文章,原文在此. 本文系统的对HTTP Headers进行了简明易懂的阐述,我仅稍作笔记. 什么是HTTP Headers. HTTP是“Hypertext Transfer Protocol”的所写,整个万维网都在使用这种协议,几乎你在浏览器里看到的大部分内容都是通过http协议来传输的,比如这篇文章.

HTTP基础

- - ITeye博客
HTTP的结构主要包括下面几个要点:. HTTP的版本主要有1.0,1.1 和更高版本.    1.1 及以上版本允许在一个TCP连接上传送多个HTTP协议,1.0能 .    1.1 及以上版本多个请求和响应可以重叠,1.0不能.    1.1 增加了很多的请求头和响应头.     一个请求行,若干小心头,以及实体内容,其中的一些消息头和实体内容是可选的,消息头和实体内容需要空行隔开.