c/c++利用socket判断web服务器是否能访问
来源:互联网 发布:卸载软件怎么卸载 编辑:程序博客网 时间:2024/06/05 11:14
最近用到相关方面知识,所以写了这个。可以测网站时延和带宽
#include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/stat.h>#include <fcntl.h>#include <string.h>#include <arpa/inet.h>#include <netdb.h>#include <netinet/in.h>#include <stdlib.h>#include <time.h> #define BUFSIZE 0xF000void geturl(char* url,char* port){int cfd;struct sockaddr_in cadd;struct hostent *pURL = NULL;char myurl[BUFSIZE];char *pHost = 0;char host[BUFSIZE],GET[BUFSIZE];char request[BUFSIZE];static char text[BUFSIZE];int i,j;struct timeval start,start_tz;struct timeval middle,middle_tz;struct timeval finish,finish_tz;float timegap = 0;float timegap_middle = 0;float bandwidth = 0; //分离主机中的主机地址和相对路径 memset(myurl,0,BUFSIZE); memset(host,0,BUFSIZE); memset(GET,0,BUFSIZE); strcpy(myurl,url); for(pHost = myurl;*pHost != '/' && *pHost != '\0';++pHost); //获取相对路径保存到GET中 if((int)(pHost-myurl) == strlen(myurl)) {strcpy(GET,"/");//即url中没有给出相对路径,需要自己手动的在url尾部加上/ } else { strcpy(GET,pHost);//地址段pHost到strlen(myurl)保存的是相对路径 } //将主机信息保存到host中 //此处将它置零,即它所指向的内容里面已经分离出了相对路径,剩下的为host信 //息(从myurl到pHost地址段存放的是HOST) *pHost = '\0'; strcpy(host,myurl); //设置socket参数 if(-1 == (cfd = socket(AF_INET,SOCK_STREAM,0))) { printf("create socket failed of client!\n"); exit(-1); } pURL = gethostbyname(host);//将上面获得的主机信息通过域名解析函数获得域名信息 //设置IP地址结构 bzero(&cadd,sizeof(struct sockaddr_in)); cadd.sin_family = AF_INET; cadd.sin_addr.s_addr = *((unsigned long*)pURL->h_addr_list[0]); // cadd.sin_port = htons(atoi(port)); //向WEB服务器发送URL信息 memset(request,0,BUFSIZE); strcat(request,"GET "); strcat(request,GET); strcat(request," HTTP/1.1\r\n");//至此为http请求行的信息 strcat(request,"HOST: "); strcat(request,host); strcat(request,"\r\n"); strcat(request,"Cache-Control: no-cache\r\n\r\n"); //连接服务器 //printf("%s \n",request);int cc;gettimeofday(&start,&start_tz); if(-1 == (cc = connect(cfd,(struct sockaddr*)&cadd,(socklen_t)sizeof(cadd)))) { fprintf(stderr,"invaild ! \ndomain name:%s \nport:%s \n",url,port); exit(1); } // printf("connect success!\n"); gettimeofday(&middle,&middle_tz); //向服务器发送url请求的request int cs; if(-1 == (cs = send(cfd,request,strlen(request),0))) { printf("向服务器发送请求的request失败!\n"); exit(1); } //printf("发送成功,发送的字节数:%d\n",cs); //客户端接收服务器的返回信息 memset(text,0,BUFSIZE); int recv_bytes; if(-1 == (recv_bytes = recv(cfd,text,BUFSIZE,0))) { fprintf(stderr,"invaild ! \ndomain name:%s \nport:%s \n",url,port); exit(1); } else {printf("%s\n",text);printf("recv %d byte \n",recv_bytes);gettimeofday(&finish,&finish_tz);printf("start.tv_sec %d start.tv_usec %d \n",start.tv_sec,start.tv_usec);printf("middle.tv_sec %d middle.tv_usec %d \n",middle.tv_sec,middle.tv_usec);printf("finish.tv_sec %d finish.tv_usec %d \n",finish.tv_sec,finish.tv_usec); int sec = finish.tv_sec - start.tv_sec;int usec = finish.tv_usec - start.tv_usec ;int sec_middle = finish.tv_sec - middle.tv_sec;int usec_middle = finish.tv_usec - middle.tv_usec ;//printf(" sec %d usec %d \n",sec,usec);timegap = sec*1000 + (float)usec/1000;timegap_middle = sec_middle*1000 + (float)usec_middle/1000;float total_kb = (float)recv_bytes/1024;float timegap_sec = (float)timegap/1000;float timegap_sec_middle = (float)timegap_middle/1000;//printf("total_kb :%f kb ! \n",total_kb);//printf("timegap_sec:%f s ! \n",timegap_sec);bandwidth = total_kb/timegap_sec; printf("normal ! \ndomain name:%s \nport:%s \n",url,port);printf("Time delay:%f ms ! \n",timegap);printf("Time delay(middle):%f ms ! \n",timegap_middle);printf("Read bandwidth :%f Kb/s ! \n",bandwidth); } close(cfd); } int main(int argc,char* argv[]){ if(argc != 3) { printf("useage:%s url port\n",argv[0]); exit(1); } geturl(argv[1],argv[2]); return 0;}
0 0
- c/c++利用socket判断web服务器是否能访问
- 判断服务器相互是否能访问
- C 判断socket 是否已经断开
- 利用个人电脑搭建WEB服务器并能通过域名访问
- 利用个人电脑搭建WEB服务器并能通过域名访问
- 浏览器client访问服务器socket(c++)
- 利用正则表达式判断字符串是否为数字(c++)
- C语言利用栈判断字符串是否为回文
- 判断是否能打开服务器网页
- Linux查看web是否能访问
- c语言socket使用http协议访问apache服务器
- 如何使用C语言判断网站、服务器是否通畅
- C Socket服务器
- 利用JS代码判断是否手机访问()
- 利用JS代码判断是否手机访问()
- 利用socket多线程访问服务器文件
- C语言中运用“非”判断一个整数是否能被5整除
- 【C#】[网络]判断是否联网
- mysql/mariadb centos7 修改root用户密码及配置参数
- 在WebView中调用android系统相册
- 在 MAC 中导出文件夹下的文件目录的树形结构
- 2016-3-28 epoll压力测试 回射延时计算 毕设C++框架
- linux系统目录架构
- c/c++利用socket判断web服务器是否能访问
- [JAVA · 初级]:12.内部类
- 苹果与安卓统一生成二维码地址
- Silicon Lab Ember zigbee学习杂谈----profile、cluster、attribute、command
- ReactiveCocoa
- LinkedList的使用方法 && Java pop与poll的区别
- FFmpeg浅尝辄止(四)——音频的解码和编码
- windows 10(64位)下实现vs20120C++调用matlab r2014a编写的m文件生成的.dll,.lib,.h文件
- HTTP 的那些事