linux socket 封装HTTP请求数据
来源:互联网 发布:切尔西靴 知乎 编辑:程序博客网 时间:2024/06/06 19:08
HTTP协议数据格式
参考如下
http://www.tuicool.com/articles/jMFfIv
懂得数据格式就可以开始模拟HTTP 请求了
nginx+lua 服务端搭建
服务器采用了nginx + lua,写一个简单的处理http请求的例子
具体参考如下
http://blog.csdn.net/qq_26437925/article/details/50946025
检测一下
curl -d "a=1" http://192.168.1.129/http_testcurl http://192.168.1.129/http_test?a=1
使用wirkshark可以查看,具体可以先导出一个xx.cap,然后查看
tcmpdump监听指定的端口号
sudo tcpdump -i eth0 -w xx.cap
linux socket 编写客户端,模拟http get请求发送数据
测试环境 ubuntu 14.04 32bit
- client.cpp
#include <sys/types.h>#include <sys/socket.h>#include <stdio.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>#include <string.h>#include <stdlib.h>#include <fcntl.h>#include <sys/shm.h>#include <cstring>#include <string>#include <sstream>#include <iostream>using namespace std;#define MYPORT 9877#define BUFFER_SIZE 1024size_t readline(int fd, void *vptr, size_t maxlen) { size_t n, rc; char c, *ptr; ptr = (char*)vptr; for(n = 1 ;n < maxlen; n++) { if( (rc = read(fd, &c, 1)) == 1) { *ptr++ = c; if(c == '\n') break; }else if( rc == 0) { *ptr = 0; return (n-1); }else{ return -1; } } *ptr = 0; return n; }int main(){ string path("/http_test?a=1"); string host("192.168.1.129"); stringstream stream; stream << "GET " << path << " HTTP/1.1\r\n" << "Host: " << host << "\r\n" <<"User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36\r\n" <<"Connection: keep-alive\r\n" <<"Accept-Encoding: gzip, deflate, sdch\r\n" <<"Accept-Language: zh-CN,zh;q=0.8\r\n" << "\r\n"; string request = stream.str(); struct sockaddr_in servaddr; memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(80); ///服务器端口 servaddr.sin_addr.s_addr = inet_addr("192.168.1.129"); ///服务器ip int len = sizeof(servaddr); int sock_cli = socket(AF_INET,SOCK_STREAM, 0); if( connect(sock_cli,(struct sockaddr *)&servaddr,len) < 0) { perror("connect"); exit(1); } printf("connect sucess!\n"); send(sock_cli, request.c_str(), request.size(), 0); char buf[1024*1024]; memset(buf,0,1024*1024); int offset = 0; int rc; while( (rc = readline(sock_cli, buf+offset, 1024) ) > 0 ){ offset += rc; } buf[offset] = 0; cout<<strlen(buf)<<endl; cout<<buf<<endl; close(sock_cli); exit(0);}
- Makefile
.PHONY: build cleanCC=g++HEADERS=-I.DEBUG=-g -ggdb WALL=-Wall -W CFLAGS=$(WALL) $(DEBUG) L_CC=$(CC) $(CFLAGS) $(HEADERS) build:clientclient:client.cpp $(L_CC) $< -o $@clean: @-if [ -f client ]; then rm client; fi
- 运行截图
linux socket 编写客户端,模拟http post 请求发送数据
client.cpp
#include <sys/types.h>#include <sys/socket.h>#include <stdio.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>#include <string.h>#include <stdlib.h>#include <fcntl.h>#include <sys/shm.h>#include <cstring>#include <string>#include <sstream>#include <iostream>using namespace std;#define MYPORT 9877#define BUFFER_SIZE 1024size_t readline(int fd, void *vptr, size_t maxlen) { size_t n, rc; char c, *ptr; ptr = (char*)vptr; for(n = 1 ;n < maxlen; n++) { if( (rc = read(fd, &c, 1)) == 1) { *ptr++ = c; if(c == '\n') break; }else if( rc == 0) { *ptr = 0; return (n-1); }else{ return -1; } } *ptr = 0; return n; }int main(){ string path("/http_test"); string post_content = "post=123"; string host("192.168.1.129"); int content_length = post_content.size(); stringstream stream; stream << "POST " << path << " HTTP/1.0\r\n" << "Host: " << host << "\r\n" <<"User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36\r\n" <<"Connection: close\r\n" <<"Content-Length:" << content_length << "\r\n" <<"Accept-Encoding: gzip, deflate, sdch\r\n" <<"Accept-Language: zh-CN,zh;q=0.8\r\n" << "\r\n" << post_content.c_str(); string request = stream.str(); struct sockaddr_in servaddr; memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(80); ///服务器端口 servaddr.sin_addr.s_addr = inet_addr("192.168.1.129"); ///服务器ip int len = sizeof(servaddr); int sock_cli = socket(AF_INET,SOCK_STREAM, 0); if( connect(sock_cli,(struct sockaddr *)&servaddr,len) < 0) { perror("connect"); exit(1); } printf("connect sucess!\n"); send(sock_cli, request.c_str(), request.size(), 0); char buf[1024*1024]; memset(buf,0,1024*1024); int offset = 0; int rc; while( (rc = readline(sock_cli, buf+offset, 1024) ) > 0 ){ offset += rc; } buf[offset] = 0; cout<<strlen(buf)<<endl; cout<<buf<<endl; close(sock_cli); exit(0);}
Makefile文件同上
运行截图
0 0
- linux socket 封装HTTP请求数据
- linux socket模拟HTTP请求上传数据
- Android封装Http请求
- Block封装http请求
- http请求封装
- 简单封装 HTTP 请求
- go http 请求封装
- http请求方法封装
- http封装ajax请求
- 一个比较好用的socket 类封装(封装http 请求)
- socket 发送http请求
- socket发送http请求
- socket模拟http请求
- socket模拟http请求
- socket模拟http请求
- socket 发送http请求
- socket实现最最最简单的http请求的数据
- Http请求、Http响应、 Socket
- java 导入导出Excel工具类ExcelUtil
- 基于RBAC用户权限控制的校验
- 剑指offer: 二叉搜索树的后序遍历序列
- 使用List框架写一个小的程序(学生选课的增删查改)
- 黑客可用一个URL劫持Ubiquiti无线网络设备
- linux socket 封装HTTP请求数据
- JDBC小结
- java抽象类和接口
- socket包长度问题: send recieve(转载)
- L1-032 Left-pad
- 某道Pwn(格式化字符串漏洞)
- .tar.lz压缩包解压
- hdu1296多项式
- 【mongodb】mongodb 权威指南笔记之增删改查