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
原创粉丝点击