0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

编写一个用于解析url的小例子

Q4MP_gh_c472c21 来源:一口Linux 作者:一口Linux 2022-04-14 12:55 次阅读

一、前言

前面一口君写了一篇关于url的文章:《一文带你理解URI 和 URL 有什么区别?》

本篇在此基础上,编写一个简单的用于解析url的小例子,

最终目标是解析出URL中所有的数据信息

编写一个用于解析url的小例子

二、库函数

用到的几个库函数如下:

1. strncasecmp

头文件

#include

函数定义

intstrncasecmp(constchar*s1,constchar*s2,size_tn);

函数说明

用来比较参数s1和s2字符串前n个字符,比较时会自动忽略大小写的差异。

返回值

参数s1和s2字符串相同则返回0。
s1若大于s2则返回大于0的值,
s1若小于s2则返回小于0的值。

2. strstr

头文件

#include

函数定义

char*strstr(constchar*str,constchar*substr);

函数说明

查找 substr 所指的空终止字节字符串在 str 所指的空终止字节字符串中的首次出现。不比较空终止字符。

若 str 或 substr 不是指向空终止字节字符串的指针,则行为未定义。

参数

str:指向要检验的空终止字节字符串的指针
substr:指向要查找的空终止字节字符串的指针

返回值

指向于 str 中找到的子串首字符的指针,或若找不到该子串则为空指针。若 substr 指向空字符串,则返回 str 。

3. strtok

函数定义

char*strtok(char*str,constchar*delim)

功能

分解字符串str为一组字符串,delim为分隔符

参数

str --要被分解成一组小字符串的字符串。
delim --包含分隔符的 C 字符串。

返回值

该函数返回被分解的第一个子字符串,如果没有可检索的字符串,则返回一个空指针。

4. strncpy

函数说明

char*strncpy(char*dest,constchar*src,size_tn)

功能

将src指向的字符串拷贝到dest执行的内存中,最多拷贝n个字符

参数

dest --指向用于存储复制内容的目标数组。
src --要复制的字符串。
n --要从源中复制的字符数。

返回值

该函数返回最终复制的字符串。

5. inet_pton/inet_ntop

头文件

#include
#include
#include

函数声明

#include
intinet_pton(intfamily,constchar*strptr,void*addrptr);

功能:

将点分十进制的ip地址转化为用于网络传输的数值格式
对于IPv4地址和IPv6地址都适用

参数

family:协议类型既可以是AF_INET(ipv4)也可以是AF_INET6(ipv6)。如果,以不被支持的地址族作为family参数,这两个函数都返回一个错误,并将errno置为EAFNOSUPPORT.

strptr:指向点分十进制的IP地址字符串,比如"192.168.1.1"

addrptr:转换结果存放在addrptr中,比如"192.168.1.1"转换为:0xC0A80101

addrptr类型为:structin_addr
typedefuint32_tin_addr_t;
structin_addr{
in_addr_ts_addr;
};

返回值

若成功则为1,若输入不是有效的表达式则为0,
若出错则为-1
constchar*inet_ntop(intfamily,constvoid*addrptr,char*strptr,size_tlen);

功能

将数值格式转化为点分十进制的ip地址格式,从数值格式(addrptr)转换到表达式(strptr),

返回值

若成功则为指向结构的指针,若出错则为NULL

6. gethostbyname

函数的定义

#include
structhostent*gethostbyname(constchar*hostname);

功能

解析hostname指向的域名,该函数会将该域名封装到DNS协议包中,发送给DNS服务器,DNS服务器会将该域名对应的地址返回,存储在structhostent

参数

hostname :存储域名对应的字符串。

返回值

若成功则为非空指针,若出错则为NULL且设置h_errno
返回的指针类型为:
structhostent{
char*h_name;//officialname
char**h_aliases;//aliaslist
inth_addrtype;//hostaddresstype
inth_length;//addresslenght
char**h_addr_list;//addresslist
}
DNS服务器返回的地址就存储在该结构体中

三、自定义结构

结构体用于存放需要解析的协议和端口

structpro_port{
charpro_s[32];
unsignedshortport;
};

目前本例子只解析以下集中协议,读者需要支持其他协议可以按照该格式增加对应信息即可

#defineHEAD_FTP_P"ftp://"
#defineHEAD_FTPS_P"ftps://"
#defineHEAD_FTPES_P"ftpes://"
#defineHEAD_HTTP_P"http://"
#defineHEAD_HTTPS_P"https://"


#definePORT_FTP21
#definePORT_FTPS_I990//implicit
#definePORT_FTPS_E21//explicit
#definePORT_HTTP80
#definePORT_HTTPS443
structpro_portg_pro_port[]={
{HEAD_FTP_P,PORT_FTP},
{HEAD_FTPS_P,PORT_FTPS_I},
{HEAD_FTPES_P,PORT_FTPS_E},
{HEAD_HTTP_P,PORT_HTTP},
{HEAD_HTTPS_P,PORT_HTTPS},
};

四、程序流程图

编写一个用于解析url的小例子

程序流程相对来说,比较简单,主函数功能说明如下:

1. parse_url()

intparse_url(char*raw_url,URL_RESULT_T*result)

参数:

raw_url:指向一个url字符串,比如:ftp://peng:pass@baidu.com/dir/index.html
result :url解析后的结果存放在该结构体中

结构体类型定义如下:
typedefstruct
{
charuser[MAX_USER_LEN];
charpass[MAX_PASS_LEN];
chardomain[INET_DOMAINSTRLEN];//域名
charsvr_dir[MAX_PATH_FILE_LEN];//文件路径
charsvr_ip[MAX_IP_STR_LEN];
intport;
}URL_RESULT_T;

功能:

解析url字符串,并将解析结果存放在result中

返回值;

成功返回URL_OK
失败返回URL_ERROR

2. void remove_quotation_mark()

voidremove_quotation_mark(char*input)

参数

input:字符串

功能

去掉字符串中的双引号"

返回值

3. parse_domain_dir

intparse_domain_dir(char*url,URL_RESULT_T*result)

参数

url:执行去掉协议头的url字符串,比如:peng:pass@baidu.com/dir/index.html
result :url解析后的结果存放在该结构体中

功能

解析出url中用户名、密码、域名/ip、文件路径等信息

返回值

成功:URL_OK
失败:URL_ERROR

4. check_is_ipv4()

intcheck_is_ipv4(char*domain)

参数

domain:指向一个域名或者IP地址点分十进制字符串,最大长度为:MAX_URL_LEN

功能

判断domain中存放的是不是合法的IP地址

返回值

1:是IP地址
-1:不是IP地址

5、dns_resoulve()

intdns_resoulve(char*svr_ip,constchar*domain)

参数

svr_ip:存放DNS协议解析过的域名对应的IP地址点分十进制字符串
domain:域名字符串

功能

将domain中的域名,通过DNS协议解析成对应的IP地址

返回值

成功:URL_OK
失败:URL_ERROR

五、运行

测试程序

voidmain(void)
{
intret;

charurl_str[256]="ftp://peng:pass@baidu.com/dir/index.html";
parse_url(url_str,&url_result_t);

ret=check_is_ipv4(url_result_t.domain);
if(ret!=1)
{
//dns
dns_resoulve(url_result_t.svr_ip,url_result_t.domain);
}
printf("
-------------result---------------
");

printf("user:%s
",url_result_t.user);
printf("pass:%s
",url_result_t.pass);
printf("port:%d
",url_result_t.port);
printf("domain:%s
",url_result_t.domain);
printf("svr_dir:%s
",url_result_t.svr_dir);
printf("svr_ip:%s
",url_result_t.svr_ip);

printf("-------------end---------------
");
}

执行结果

编写一个用于解析url的小例子

六、代码获取

完整代码可以进入仓库获取:

https://gitee.com/yikoulinux/url

原文标题:C语言实现url解析小实例

文章出处:【微信公众号:嵌入式ARM】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • URL
    URL
    +关注

    关注

    0

    文章

    131

    浏览量

    14822
  • 编写
    +关注

    关注

    0

    文章

    29

    浏览量

    8372
  • 库函数
    +关注

    关注

    0

    文章

    177

    浏览量

    33713

原文标题:C语言实现url解析小实例

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    ArkTS语言基础类库-解析

    被设计用来传输和存储数据,是种可扩展标记语言。语言基础类库提供了[XML生成、解析与转换]的能力。 URL、URI构造和解析能力:其中[URI]是统
    发表于 02-20 16:44

    labview的例子使用

    labview的串口通讯小例子
    发表于 02-20 22:56

    求助、帮我解析一个程序范例的设计思路

    ` 网络讲坛第三期中的个例子,但是看得不是很明白,希望大牛能不能给我们解析下这个程序的设计步骤或者思路,各个界面之间的切换方式等?谢谢!`
    发表于 02-01 11:03

    用labview编写的控制摄像头拍照及保存的例子,谢谢!

    用labview编写的控制摄像头拍照及保存的例子,谢谢!调用摄像头应该是怎么调用,然后调用了拍摄的图片是和保存字符串样的保存方式么?
    发表于 03-15 13:05

    照着书上的例子编写labview程序。

    照着书上的例子编写labview程序,程序和错误如下图如下图。大家帮着解答
    发表于 05-25 14:38

    C语言实现url解析小实例

    编写简单的用于解析url的小例子,最终目标是
    发表于 04-12 09:10

    URL,URL是什么意思

    URL,URL是什么意思 URL(Uniform Resoure Locator:统一资源定位器)是WWW页的地址,它从左到右由下述部分组成: &
    发表于 03-22 10:53 8195次阅读

    C#教程之打开Url

    C#教程之打开Url,很好的C#资料,快来学习吧。
    发表于 04-20 10:50 5次下载

    C#编写的陀螺测试温度控制例子

    C#编写的陀螺仪温度控制例子,能够帮助您在最短时间内掌握C#学习,简洁明了,如果有需要的话,大家可以下载了
    发表于 05-06 15:06 5次下载

    Verilog编写的信道估计

    Xilinx FPGA工程例子源码:Verilog编写的信道估计
    发表于 06-07 14:54 38次下载

    检测恶意URL的方法

    提出一种高效的基于段模式的检测恶意URL的方法,该方法首先解析已标注的恶意URL中的域名、路径名和文件名3个语义段,然后通过建立以三元组为词项的倒排索引快速计算恶意URL每个语义段的模
    发表于 02-27 11:18 1次下载
    检测恶意<b class='flag-5'>URL</b>的方法

    简述go语言标准库 net/url 库的过程。

    url解析 URL 并实现了查询的逸码,参见 RFC 3986。 func PathEscape func PathEscape(s string) string PathEscape 会将字符串
    的头像 发表于 08-14 10:35 1375次阅读

    IP知识百科之URL过滤

    URL过滤 URL过滤是一种针对用户的URL请求进行上网控制的技术,通过允许或禁止用户访问某些网页资源,达到规范上网行为和降低安全风险的目的。URL过滤可以基于
    的头像 发表于 09-23 11:08 5007次阅读

    用于解析和操作URL的命令行工具

    curl 作者 Daniel 宣布推出新的开源项目:trurl,这是一款用于解析和操作 URL 的命令行工具,主要是面向 shell 脚本作者提供。Daniel 称项目名字中的 'tr' 代表 transla
    的头像 发表于 04-11 10:02 812次阅读

    MySQL数据库的url地址

    MySQL数据库的URL地址是用于连接到MySQL服务器的地址。URL是一种统一资源定位符,用于指定特定资源的位置和访问方式。MySQL数据库的UR
    的头像 发表于 12-06 10:58 952次阅读