如果使用socket发送http请求(并且编译成可以被lr调用的压力测试脚本)

#include  <unistd.h>

#include  <sys/types.h>       /* basic system data types */

#include  <sys/socket.h>      /* basic socket definitions */

#include  <netinet/in.h>      /* sockaddr_in{} and other Internet defns */

#include  <arpa/inet.h>       /* inet(3) functions */

#include <netdb.h> /*gethostbyname function */

#include <sys/time.h>

#include <time.h>

#include <stdlib.h>

#include <errno.h>

#include <stdio.h>

#include <string.h>

#include<openssl/rsa.h>

#include<openssl/pem.h>

#include<openssl/err.h>

#define OPENSSLKEY "/test.key"

#define PUBLICKEY "/test_pub.key"

#define BUFFSIZE 1024

#define MAXLINE 10240

char *my_encrypt(char *str,char *path_key){

char *p_en;

RSA *p_rsa;

FILE *file;

int flen,rsa_len;

if((file=fopen(path_key,"r"))==NULL){

perror("open key file error");

return NULL;

}

if((p_rsa=PEM_read_RSA_PUBKEY(file,NULL,NULL,NULL))==NULL){

//if((p_rsa=PEM_read_RSAPublicKey(file,NULL,NULL,NULL))==NULL){   换成这句死活通不过,无论是否将公钥分离源文件

ERR_print_errors_fp(stdout);

return NULL;

}

flen=strlen(str);

rsa_len=RSA_size(p_rsa);

p_en=(unsigned char *)malloc(rsa_len+1);

memset(p_en,0,rsa_len+1);

if(RSA_public_encrypt(rsa_len,(unsigned char *)str,(unsigned char*)p_en,p_rsa,RSA_NO_PADDING)<0){

return NULL;

}

RSA_free(p_rsa);

fclose(file);

return p_en;

}

char *my_decrypt(char *str,char *path_key){

char *p_de;

RSA *p_rsa;

FILE *file;

int rsa_len;

if((file=fopen(path_key,"r"))==NULL){

perror("open key file error");

return NULL;

}

if((p_rsa=PEM_read_RSAPrivateKey(file,NULL,NULL,NULL))==NULL){

ERR_print_errors_fp(stdout);

return NULL;

}

rsa_len=RSA_size(p_rsa);

p_de=(unsigned char *)malloc(rsa_len+1);

memset(p_de,0,rsa_len+1);

if(RSA_private_decrypt(rsa_len,(unsigned char *)str,(unsigned char*)p_de,p_rsa,RSA_NO_PADDING)<0){

return NULL;

}

RSA_free(p_rsa);

fclose(file);

return p_de;

}

EVP_PKEY * getKey(char * key_path) {

X509 *cert = NULL;

BIO *in = NULL;

EVP_PKEY *key;

in = BIO_new_file(key_path, "r");

cert = PEM_read_bio_X509(in, NULL, NULL, NULL);

if (cert != NULL) {

key = (EVP_PKEY *) X509_get_pubkey(cert);

} else {

in = BIO_new_file(key_path, "r");

key = PEM_read_bio_PUBKEY(in, NULL,NULL, NULL);

}

BIO_free(in);

if (cert) {

X509_free(cert);

}

return key;

}

char *my_encrypt2(unsigned char *str,int * plen){

int cryptedlen;

unsigned char *cryptedbuf;

int i=0;

EVP_PKEY *key;

key = getKey(PUBLICKEY);

*plen = EVP_PKEY_size(key);

cryptedbuf = malloc((*plen) + 1);

memset(cryptedbuf,0,(*plen)+ 1);

if(RSA_public_encrypt(strlen(str),(unsigned char *)str,cryptedbuf,key->pkey.rsa,RSA_PKCS1_PADDING)<0){

return NULL;

}

EVP_PKEY_free(key);

for(i=0;i<128;i++) {

printf(" %d ", (unsigned char)cryptedbuf[i]);

}

printf("\n");

return cryptedbuf;

}

int opensocket(char *ip,int port)

{

int connfd;

char * servInetAddr = ip;

int servPort = port;

char dataBuffer[MAXLINE];

struct sockaddr_in servaddr;

//设置超时时间

struct timeval timeout={30,0};//3s

//connfd = socket(AF_INET, SOCK_STREAM, 0);

if ((connfd=socket(AF_INET,SOCK_STREAM,0))== -1)

{

perror("socket");

return 0;

}

if (setsockopt(connfd,SOL_SOCKET,SO_SNDTIMEO,(const char*)&timeout,sizeof(timeout)) == -1)

{

perror("setsockopt");

return 0;

}

bzero(&servaddr, sizeof(servaddr));

servaddr.sin_family = AF_INET;

servaddr.sin_port = htons(servPort);

inet_pton(AF_INET, servInetAddr, &servaddr.sin_addr);

if (connect(connfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0) {

perror("connect error");

return -1;

}

else{

//return 1;

return connfd;

}

}

void closesocket(int connfd){

close(connfd);

}

int  msgsend(int connfd,char *msg, int len){

char dataBuffer[MAXLINE];

bzero(dataBuffer,MAXLINE+1);

strncpy(dataBuffer,msg,strlen(msg));

int errSend = send(connfd,dataBuffer,len,0);

if(-1 == errSend)

{

return -1;

}else{

return 1;

}

}

//对rsa加密后的数据进行发送

int rsa_msgsend(int connfd,char * source)

{

char *ptr_en,*ptr_de;

char send_msg[1024];

int plen=0;

ptr_en=my_encrypt2(source,&plen);

char head[150];

sprintf(head, "POST /auth HTTP/1.1\r\nHost: bjcm01.portal.freemse.360.cn\r\nAccept-Version: 1\r\nAppId:1\r\nUser-Agent:MSE 8.0.0;Android 5.0\r\nContent-Length: %d\r\n\r\n", plen);

printf("plen :%d \n",plen);

// printf("source is    :%s\n",start);

//ptr_de=my_decrypt(ptr_en,OPENSSLKEY);

//printf("jiemi data %s\n",ptr_de);

//sprintf(send_msg,"%s%s",start,ptr_en);

//printf("send_msg %s\n",start);

int h_send_result = msgsend(connfd,head, strlen(head));

printf("head: %s\n",head);

int b_send_result =  msgsend(connfd,ptr_en, plen);

printf("ptr_en: %s\n",ptr_en);

if( h_send_result == -1 || b_send_result == -1){

return -1;

}

else{

return 1;

}

}

//对比返回的结果

int cmprecvmsg(int connfd,char *msg,int len){

char dataBuffer[MAXLINE];

bzero(dataBuffer,MAXLINE+1);

int recv_bytes = recv(connfd,dataBuffer,MAXLINE,0);

//return dataBuffer;

if(recv_bytes < 0)

{

return -2;

}

if(memcmp(dataBuffer,msg,len)==0){

return 1;

}else{

return -1;

}

}

int gettimeofday(struct timeval *tv, struct timezone *tz);

int httpSendAndRcv(int sockfd,char *realhost){

struct timeval t_start,t_end;

long cost_time = 0;

#define BUFSIZE 1024

int ret, i,j, h;

struct sockaddr_in servaddr;

char str1[4096], str2[4096], buf[BUFSIZE];

socklen_t len;

fd_set   t_set1;

struct timeval timeout={5,0}; //select等待5秒,5秒轮询,要非阻塞就置0

//发送数据

memset(str1, 0, 4096);//一定要初始化一下该内存,因为在测试时发现发送的字符串有一些脏数据

strcat(str1, "GET / HTTP/1.1\n");

strcat(str1, "Host: test.com\r\n");

strcat(str1, "RealHost:");

strcat(str1, realhost);

strcat(str1, "\r\n");

strcat(str1, "Content-Type: application/x-www-form-urlencoded");

strcat(str1, "\r\n\r\n");

printf("%s\n",str1);

gettimeofday(&t_start, NULL);

long start = ((long)t_start.tv_sec)*1000+(long)t_start.tv_usec/1000;//为了获取毫秒的时间,只有将秒和微妙都转成毫秒来计算了

printf("Start time: %ld ms\n", start);

ret = write(sockfd,str1,strlen(str1));

if (ret < 0) {

printf("发送失败!错误代码是%d,错误信息是‘%s‘\n",errno, strerror(errno));

exit(0);

}else{

printf("消息发送成功,共发送了%d个字节!\n\n", ret);

}

while(1){

//sleep(1);

FD_ZERO(&t_set1);

FD_SET(sockfd, &t_set1);

h= 0;

// printf("--------------->1");

h= select(sockfd +1, &t_set1, NULL, NULL, &timeout);

//printf("--------------->2");

if (h == 0) break;  //如果在超时时间内没有数据返回认为http的response接受完毕,可以进行下一轮请求

if (h < 0) {

close(sockfd);

printf("在读取数据报文时SELECT检测到异常,该异常导致线程终止!\n");

return -1;

};

if (h > 0){

memset(buf, 0, 4096);

i= read(sockfd, buf, 4095);

if (i==0){

close(sockfd);

printf("读取数据报文时发现远端关闭,该线程终止!\n");

return -1;

}

// printf("recive");

printf("%s\n", buf);

}

}

//获取结束时间

gettimeofday(&t_end, NULL);

long end = ((long)t_end.tv_sec)*1000+(long)t_end.tv_usec/1000;

printf("End time: %ld ms\n", end);

//统计网页响应的时间差(当然包括了一次超时时间)

cost_time = end - start;

printf("Cost time: %ld ms\n", cost_time);

return 0;

}

//测试用

int main()

{

//unsigned char *source="{\"phone\":\"10002415407\", \"token\":\"47\", \"wid\":\"1\"}";

char *source="{\"phone\":\"1212121212\", \"token\":\"121212121\", \"wid\":\"wid\"}";

//char *ptr_en,*ptr_de;

char *ip="127.0.0.1";

int port=80

int connfd;

char buf[20];

char buf1[5];

char * realhost="m.so.com";

// char send_msg[1024];

char dataBuffer[21700];

int j;

//int plen=0;

//ptr_en=my_encrypt2(source,&plen);

//char start[150];

//sprintf(start, "POST /auth HTTP/1.1\r\nHost: bjcm01.portal.freemse.360.cn\r\nAccept-Version: 1\r\nUser-Agent:MSE 8.0.0;Android 5.0\r\nContent-Length: %d\r\n\r\n", plen);

//printf("plen :%d \n",plen);

// printf("source is    :%s\n",start);

//ptr_de=my_decrypt(ptr_en,OPENSSLKEY);

//printf("jiemi data %s\n",ptr_de);

connfd=opensocket(ip,port);

//sprintf(send_msg,"%s%s",start,ptr_en);

//printf("send_msg %s\n",start);

// msgsend(connfd,start, strlen(start));

//msgsend(connfd,ptr_en, plen);

rsa_msgsend(connfd,source);

recv(connfd,dataBuffer,21700,0);

sscanf(dataBuffer, "%*[^\"]%[^m]", buf);

sscanf(buf, "%*[^:]:%[^,]", buf1);

printf("recv %s\n",dataBuffer);

printf("%s\n",buf1);

for (j=0;j<3;j++) msgrecv(connfd,realhost);

closesocket(connfd);

return 0;

}

时间: 2024-11-05 02:26:28

如果使用socket发送http请求(并且编译成可以被lr调用的压力测试脚本)的相关文章

socket发送http请求

转自:思齐-socket发送http请求 socket方式: $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array("sec"=>20, "usec"=>0)); socket_connect($socket, 'www.baidu.com', 80); //里面的换行代表 \r

使用socket发送http请求(GET/POST)

使用socket发送http请求(GET/POST) 下载LOFTER客户端 1.socket的原理 在相关文章中已经提及,不再赘述. 2.http头的格式 (1)请求行请求行由请求方法字段.URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔.例如,GET /index.html HTTP/1.1.HTTP协议的请求方法有GET.POST.HEAD.PUT.DELETE.OPTIONS.TRACE.CONNECT.这里介绍最常用的GET方法和POST方法.GET:当客户端要从服务器中读

loadrunner简单使用——HTTP,WebService,Socket压力测试脚本编写

先说明一下,本人是开发,对测试不是特别熟悉,但因工作的需要,也做过一些性能测试方面的东西.比较久之前很简单的用过,最近又用到了,熟悉一下.现做一个总结. 使用loadrunner进行压力测试主要分两步,第一步是编写脚本(比较重点),第二步执行测试(配置都是在界面上点点就行了,当然我只的是比较简单的,能满足日常需要的),第三步分析结果(这一步比较高深,但是对于我来说能看懂简单的性能指标就OK了).所以这里就说一下脚本的编写,给未来再用到做参考. 1.HTTP的GET请求 这里以访问百度为例,地址h

如何把js文件编译成dll供页面调用

1. 在解决方案中添加一个项目:JSControl 2. 在这个项目添加一个js文件(JScript1.js) 脚本的内容: function showAlert(){ alert('Today is a good dary'); } 3. 改变JScript1.js的属性,Build Action为Embedded Resource(嵌入的资源) 4. 在JSControl项目的AssemblyInfo.cs文件中添加一行:(注意JSControl.JScript1.js,JSControl是

c/c++ socket发送http请求访问网站

这几天课比较少,校园网上网要认证才能上网,每次必须输入学号密码,为了方便,写了一个自动登录以及如果在线,登录自服务系统强制下线的小工具. 强制下线思路:获取sessionID---------->获取验证码图片------------>AspriseOCRLib识别验证码--------------->MD5加密.url Encode---------------->登录自服务系统---------------->强制下线--------------------->退出

PHP + Socket 发送http请求进而实现网站灌水

本质上实现组装http信息的请求行,头信息,主题信息,参考it自学网 cookie信息和http请求头有很大关系,注意把http请求头信息传递到函数里面 01-msg.php <?php require('./http.class.php'); $http = new Http('http://home.verycd.com/cp.php?ac=pm&op=send&touid=0&pmid=0'); $http->setHeader('Accept: text/htm

loadrunner简单使用&mdash;&mdash;HTTP,WebService,Socket压力测试脚本编写

先说明一下,本人是开发,对测试不是特别熟悉,但因工作的需要,也做过一些性能测试方面的东西.比较久之前很简单的用过,最近又用到了,熟悉一下.现做一个总结. 使用loadrunner进行压力测试主要分两步:第一步是编写脚本(比较重点),第二步执行测试(配置都是在界面上点点就行,当然我只是比较简单的,能满足日常需要的),第三步分析结果(这一步比较高深,但是对于我来说能看懂简单的性能指标就OK)所以这里就说一下脚本的编写,给未来再用到做参考. 1,HTTP的GET请求 这里以访问百度为例,地址http:

(转载)loadrunner简单使用——HTTP,WebService,Socket压力测试脚本编写

原文出处:http://ajita.iteye.com/blog/1728243/ 先说明一下,本人是开发,对测试不是特别熟悉,但因工作的需要,也做过一些性能测试方面的东西.比较久之前很简单的用过,最近又用到了,熟悉一下.现做一个总结. 使用loadrunner进行压力测试主要分两步,第一步是编写脚本(比较重点),第二步执行测试(配置都是在界面上点点就行了,当然我只的是比较简单的,能满足日常需要的),第三步分析结果(这一步比较高深,但是对于我来说能看懂简单的性能指标就OK了).所以这里就说一下脚

超级web服务器yum 安装apache+源码编译tomcat+awstat+phpmadin+mysql+php+AB压力测试

实验环境: 两台机器:Centos6.4 机器一: 192.168.56.10  安装httpd  php   等整合 机器二: 192.168.56.11 安装 mysql ======================================================================================== (iptables -t nat -I PREROUTING -d 外IP -p tcp -m tcp --dport 端口 -j DNAT --