首页 > 代码库 > 字符串解析

字符串解析

         在工程应用中,通常回有这么一种情况:将数据按照一定的格式打包发送出去,或者将接收到的数据按照某种个是进行解析。

         假设现在想向服务器请求一个网页内容:

char request[1024]={0};
sprintf(request, "GET /%s HTTP/1.0\r\n"
           "Host: %s\r\n"
           "Accept: */*\r\n"
           "Connection: Keep-Alive\r\n"
           "User-Agent: Mozilla/5.0 (compatible; Qteqpidspider/1.0;)\r\n"
           "Referer: %s\r\n\r\n", url->path, url->domain, url->domain);
write(fd, request, strlen(request));

    这里涉及到http请求报文格式:

<request-line>      请求行,包括请求类型,要访问的资源,http版本
<headers>         头部,说明服务器要使用的附加信息
<blank line>      空行
<request-body>      任意数据组成的主体

    接收到服务器回传的信息,需要进行解析:

typedef struct Header{
       char *content_type;
       int status_code;
}Header;

Header * parse_header(char *header)
{
        char *start = header;
        char *p = NULL;
        char **sps;
        Header *h = (Header*)calloc(1, sizeof(Header));
        if((p=strstr(start, "\r\n")) != NULL){
                  *p=\0;
                  sps = strsplit(start,  , &c, 2);
                  if(c==3)
                             h->status_code = atoi(sps[1])
                  else
                             h->status_code = 600;
                  start= p+2; 
        }

        while((p = strstr(start, "\r\n")) != NULL)
        {
                   *p = \0;
                   sps = strsplit(start, :, &c, 1);
                   if(c == 2)
                               if(strcasecmp(sps[0], "content-type") == 0)
                                                 h->content_type = strdup(sps[1]);
                    start = p+2;
        }
        return h;
}    

               这里涉及到http的响应报文:

<status-line>        状态行
<headers>            消息报头
<blank line>         空行
<response-body>      正文

 

字符串解析