如何读取http请求(http代理服务器)

时间:2016-03-16 18:38:20

标签: c++ c sockets http pointers

我必须创建一个http代理。在代理端,我必须解析用户发送的http请求。

问题是:如何从客户端读取二进制数据,最后我会得到一个包含完整请求的char数组。

我所做的是:每次读取1个字节。

    char c;
    int  n = read(con,&c,1);

我看到很多实现,我们使用1024字节作为缓冲区的大小,但是我们确定请求的大小不会超过1024吗?

通常首先我必须为缓冲区数组分配内存,那么我怎么知道分配相同大小内存的请求的大小呢?

我的完整方法:

void readToken(int con,char *token){
char c;
int i=0;
do{
    int  n = read(con,&c,1);
    *token++ = c;
    }while(c!=' ' && c!='\n');      
}

void readLine(int con,char *line){
    char c;int i=0;
    do{
        int  n = read(con,&c,1);
        *line++ = c;
        }while(c!='\n');

}
char * handleRequest(int con){
    char resource[30];
    char version[5];
    char  method[4] ;
    //i read 4 byte to get the method tyepe 
    int n = read(con,&method,4);
    //here i read until i get a blank space
    readToken(con,resource);
    //readToken(con,version);
    printf("the method is%s\n",method);
    printf("the resource asked is%s\n",resource);
    //printf("the resource asked is%s\n",version);
    printf("the method read is %s",firstLine);
    readLine(con,hostLine);
    printf("the method read is %s",hostLine);       
}

2 个答案:

答案 0 :(得分:1)

单个字符的阅读非常低效,并且会极大地降低你的速度。相反,你应该在循环中读取大小合适的大小(1024似乎是好的初始猜测),并将读取缓冲区附加到目前为止读取的总数据中。使用C ++ std::vector非常容易。

答案 1 :(得分:0)

解析HTTP请求是一项非常复杂的任务,我认为使用像http-parser这样的库会更容易,它会以非常有效的方式为您解析。