我必须创建一个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);
}
答案 0 :(得分:1)
单个字符的阅读非常低效,并且会极大地降低你的速度。相反,你应该在循环中读取大小合适的大小(1024似乎是好的初始猜测),并将读取缓冲区附加到目前为止读取的总数据中。使用C ++ std::vector
非常容易。
答案 1 :(得分:0)
解析HTTP请求是一项非常复杂的任务,我认为使用像http-parser这样的库会更容易,它会以非常有效的方式为您解析。