一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

編寫(xiě)一個(gè)用于解析url的小例子

Q4MP_gh_c472c21 ? 來(lái)源:一口Linux ? 作者:一口Linux ? 2022-04-14 12:55 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、前言

前面一口君寫(xiě)了一篇關(guān)于url的文章:《一文帶你理解URI 和 URL 有什么區(qū)別?》

本篇在此基礎(chǔ)上,編寫(xiě)一個(gè)簡(jiǎn)單的用于解析url的小例子,

最終目標(biāo)是解析出URL中所有的數(shù)據(jù)信息。

編寫(xiě)一個(gè)用于解析url的小例子

二、庫(kù)函數(shù)

用到的幾個(gè)庫(kù)函數(shù)如下:

1. strncasecmp

頭文件

#include

函數(shù)定義

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

函數(shù)說(shuō)明

用來(lái)比較參數(shù)s1和s2字符串前n個(gè)字符,比較時(shí)會(huì)自動(dòng)忽略大小寫(xiě)的差異。

返回值

若參數(shù)s1和s2字符串相同則返回0。
s1若大于s2則返回大于0的值,
s1若小于s2則返回小于0的值。

2. strstr

頭文件

#include

函數(shù)定義

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

函數(shù)說(shuō)明

查找 substr 所指的空終止字節(jié)字符串在 str 所指的空終止字節(jié)字符串中的首次出現(xiàn)。不比較空終止字符。

若 str 或 substr 不是指向空終止字節(jié)字符串的指針,則行為未定義。

參數(shù)

str:指向要檢驗(yàn)的空終止字節(jié)字符串的指針
substr:指向要查找的空終止字節(jié)字符串的指針

返回值

指向于 str 中找到的子串首字符的指針,或若找不到該子串則為空指針。若 substr 指向空字符串,則返回 str 。

3. strtok

函數(shù)定義

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

功能

分解字符串str為一組字符串,delim為分隔符

參數(shù)

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

返回值

該函數(shù)返回被分解的第一個(gè)子字符串,如果沒(méi)有可檢索的字符串,則返回一個(gè)空指針。

4. strncpy

函數(shù)說(shuō)明

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

功能

將src指向的字符串拷貝到dest執(zhí)行的內(nèi)存中,最多拷貝n個(gè)字符

參數(shù)

dest --指向用于存儲(chǔ)復(fù)制內(nèi)容的目標(biāo)數(shù)組。
src --要復(fù)制的字符串。
n --要從源中復(fù)制的字符數(shù)。

返回值

該函數(shù)返回最終復(fù)制的字符串。

5. inet_pton/inet_ntop

頭文件

#include
#include
#include

函數(shù)聲明

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

功能:

將點(diǎn)分十進(jìn)制的ip地址轉(zhuǎn)化為用于網(wǎng)絡(luò)傳輸?shù)臄?shù)值格式
對(duì)于IPv4地址和IPv6地址都適用

參數(shù)

family:協(xié)議類(lèi)型既可以是AF_INET(ipv4)也可以是AF_INET6(ipv6)。如果,以不被支持的地址族作為family參數(shù),這兩個(gè)函數(shù)都返回一個(gè)錯(cuò)誤,并將errno置為EAFNOSUPPORT.

strptr:指向點(diǎn)分十進(jìn)制的IP地址字符串,比如"192.168.1.1"

addrptr:轉(zhuǎn)換結(jié)果存放在addrptr中,比如"192.168.1.1"轉(zhuǎn)換為:0xC0A80101

addrptr類(lèi)型為:structin_addr
typedefuint32_tin_addr_t;
structin_addr{
in_addr_ts_addr;
};

返回值

若成功則為1,若輸入不是有效的表達(dá)式則為0,
若出錯(cuò)則為-1
constchar*inet_ntop(intfamily,constvoid*addrptr,char*strptr,size_tlen);

功能

將數(shù)值格式轉(zhuǎn)化為點(diǎn)分十進(jìn)制的ip地址格式,從數(shù)值格式(addrptr)轉(zhuǎn)換到表達(dá)式(strptr),

返回值

若成功則為指向結(jié)構(gòu)的指針,若出錯(cuò)則為NULL

6. gethostbyname

函數(shù)的定義

#include
structhostent*gethostbyname(constchar*hostname);

功能

解析hostname指向的域名,該函數(shù)會(huì)將該域名封裝到DNS協(xié)議包中,發(fā)送給DNS服務(wù)器,DNS服務(wù)器會(huì)將該域名對(duì)應(yīng)的地址返回,存儲(chǔ)在structhostent

參數(shù)

hostname :存儲(chǔ)域名對(duì)應(yīng)的字符串。

返回值

若成功則為非空指針,若出錯(cuò)則為NULL且設(shè)置h_errno
返回的指針類(lèi)型為:
structhostent{
char*h_name;//officialname
char**h_aliases;//aliaslist
inth_addrtype;//hostaddresstype
inth_length;//addresslenght
char**h_addr_list;//addresslist
}
DNS服務(wù)器返回的地址就存儲(chǔ)在該結(jié)構(gòu)體中

三、自定義結(jié)構(gòu)

結(jié)構(gòu)體用于存放需要解析的協(xié)議和端口號(hào)

structpro_port{
charpro_s[32];
unsignedshortport;
};

目前本例子只解析以下集中協(xié)議,讀者需要支持其他協(xié)議可以按照該格式增加對(duì)應(yīng)信息即可

#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},
};

四、程序流程圖

編寫(xiě)一個(gè)用于解析url的小例子

程序流程相對(duì)來(lái)說(shuō),比較簡(jiǎn)單,主函數(shù)功能說(shuō)明如下:

1. parse_url()

intparse_url(char*raw_url,URL_RESULT_T*result)

參數(shù):

raw_url:指向一個(gè)url字符串,比如:ftp://peng:pass@baidu.com/dir/index.html
result :url解析后的結(jié)果存放在該結(jié)構(gòu)體中

結(jié)構(gòu)體類(lèi)型定義如下:
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字符串,并將解析結(jié)果存放在result中

返回值;

成功返回URL_OK
失敗返回URL_ERROR

2. void remove_quotation_mark()

voidremove_quotation_mark(char*input)

參數(shù)

input:字符串

功能

去掉字符串中的雙引號(hào)"

返回值

無(wú)

3. parse_domain_dir

intparse_domain_dir(char*url,URL_RESULT_T*result)

參數(shù)

url:執(zhí)行去掉協(xié)議頭的url字符串,比如:peng:pass@baidu.com/dir/index.html
result :url解析后的結(jié)果存放在該結(jié)構(gòu)體中

功能

解析出url中用戶(hù)名、密碼、域名/ip、文件路徑等信息

返回值

成功:URL_OK
失?。篣RL_ERROR

4. check_is_ipv4()

intcheck_is_ipv4(char*domain)

參數(shù)

domain:指向一個(gè)域名或者IP地址點(diǎn)分十進(jìn)制字符串,最大長(zhǎng)度為:MAX_URL_LEN

功能

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

返回值

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

5、dns_resoulve()

intdns_resoulve(char*svr_ip,constchar*domain)

參數(shù)

svr_ip:存放DNS協(xié)議解析過(guò)的域名對(duì)應(yīng)的IP地址點(diǎn)分十進(jìn)制字符串
domain:域名字符串

功能

將domain中的域名,通過(guò)DNS協(xié)議解析成對(duì)應(yīng)的IP地址

返回值

成功:URL_OK
失敗:URL_ERROR

五、運(yùn)行

測(cè)試程序

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---------------
");
}

執(zhí)行結(jié)果

編寫(xiě)一個(gè)用于解析url的小例子

六、代碼獲取

完整代碼可以進(jìn)入倉(cāng)庫(kù)獲取:

https://gitee.com/yikoulinux/url

原文標(biāo)題:C語(yǔ)言實(shí)現(xiàn)url解析小實(shí)例

文章出處:【微信公眾號(hào):嵌入式ARM】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

審核編輯:湯梓紅


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • URL
    URL
    +關(guān)注

    關(guān)注

    0

    文章

    141

    瀏覽量

    15870
  • 編寫(xiě)
    +關(guān)注

    關(guān)注

    0

    文章

    29

    瀏覽量

    8615
  • 庫(kù)函數(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    177

    瀏覽量

    34432

原文標(biāo)題:C語(yǔ)言實(shí)現(xiàn)url解析小實(shí)例

文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    編寫(xiě)一個(gè)QT程序

    學(xué)習(xí)種編程語(yǔ)言或編程環(huán)境,通常會(huì)先編寫(xiě)個(gè)“Hello World”程序。我們也用 Qt Creator 編寫(xiě)
    發(fā)表于 11-21 10:41 ?1222次閱讀

    Ntag424使用Sun功能編寫(xiě)URL的卡片中的URL是否可以在每次讀取時(shí)更改?

    必須更改(類(lèi)似于動(dòng)態(tài)值)實(shí)際上我有幾個(gè)問(wèn)題,他們的答案將解釋切。我想根據(jù)場(chǎng)景提出些問(wèn)題; 1- 我使用 Sun 功能編寫(xiě) URL 的卡片中的
    發(fā)表于 04-10 06:20

    個(gè)用labview編寫(xiě)的控制攝像頭拍照及保存的例子,謝謝!

    個(gè)用labview編寫(xiě)的控制攝像頭拍照及保存的例子,謝謝!調(diào)用攝像頭應(yīng)該是怎么調(diào)用,然后調(diào)用了拍攝的圖片是和保存字符串樣的保存方式么?
    發(fā)表于 03-15 13:05

    照著書(shū)上的例子編寫(xiě)個(gè)labview程序。

    照著書(shū)上的例子編寫(xiě)個(gè)labview程序,程序和錯(cuò)誤如下圖如下圖。大家?guī)椭獯?b class='flag-5'>一
    發(fā)表于 05-25 14:38

    C語(yǔ)言實(shí)現(xiàn)url解析小實(shí)例

    編寫(xiě)個(gè)簡(jiǎn)單的用于解析url的小例子,最終目標(biāo)是
    發(fā)表于 04-12 09:10

    URL,URL是什么意思

    URL,URL是什么意思 URL(Uniform Resoure Locator:統(tǒng)資源定位器)是WWW頁(yè)的地址,它從左到右由下述部分組成: &
    發(fā)表于 03-22 10:53 ?8343次閱讀

    C#編寫(xiě)的陀螺測(cè)試溫度控制例子

    C#編寫(xiě)的陀螺儀溫度控制例子,能夠幫助您在最短時(shí)間內(nèi)掌握C#學(xué)習(xí),簡(jiǎn)潔明了,如果有需要的話(huà),大家可以下載了
    發(fā)表于 05-06 15:06 ?5次下載

    STM32第一個(gè)例子

    STM32第一個(gè)例子是學(xué)習(xí)RAM單片機(jī)非常好的開(kāi)始
    發(fā)表于 07-14 18:14 ?0次下載

    檢測(cè)惡意URL的方法

    提出種高效的基于段模式的檢測(cè)惡意URL的方法,該方法首先解析已標(biāo)注的惡意URL中的域名、路徑名和文件名3個(gè)語(yǔ)義段,然后通過(guò)建立以三元組為詞
    發(fā)表于 02-27 11:18 ?1次下載
    檢測(cè)惡意<b class='flag-5'>URL</b>的方法

    個(gè)最簡(jiǎn)單的事件驅(qū)動(dòng)的IO libevent編程例子

    本文演示個(gè)最簡(jiǎn)單的基于libevent編程的例子。libevent是事件驅(qū)動(dòng)的IO,適用于“好萊塢原則”。
    的頭像 發(fā)表于 03-23 09:54 ?6636次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>個(gè)</b>最簡(jiǎn)單的事件驅(qū)動(dòng)的IO libevent編程<b class='flag-5'>例子</b>

    單片機(jī)最小JSON解析,含編寫(xiě)個(gè)非常簡(jiǎn)單的JSON資料下載

    電子發(fā)燒友網(wǎng)為你提供單片機(jī)最小JSON解析,含編寫(xiě)個(gè)非常簡(jiǎn)單的JSON資料下載的電子資料下載,更有其他相關(guān)的電路圖、源代碼、課件教程、中文資料、英文資料、參考設(shè)計(jì)、用戶(hù)指南、解決方
    發(fā)表于 04-27 08:44 ?13次下載
    單片機(jī)最小JSON<b class='flag-5'>解析</b>,含<b class='flag-5'>編寫(xiě)</b>了<b class='flag-5'>一</b><b class='flag-5'>個(gè)</b>非常簡(jiǎn)單的JSON資料下載

    簡(jiǎn)述go語(yǔ)言標(biāo)準(zhǔn)庫(kù) net/url 庫(kù)的過(guò)程。

    本文是篇學(xué)習(xí)筆記,記錄了作者學(xué)習(xí) go 語(yǔ)言標(biāo)準(zhǔn)庫(kù) net/url 庫(kù)的過(guò)程。 參考:https://studygolang.com/pkgdoc 導(dǎo)入方式: import “net/url
    的頭像 發(fā)表于 08-14 10:35 ?1826次閱讀

    個(gè)模擬解像力圖表的例子

    實(shí)現(xiàn)本節(jié)介紹了個(gè)模擬解像力圖表的例子。作為個(gè)例子,我們將使用
    的頭像 發(fā)表于 09-21 10:47 ?1331次閱讀

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

    curl 作者 Daniel 宣布推出新的開(kāi)源項(xiàng)目:trurl,這是用于解析和操作 URL 的命令行工具,主要是面向 shell 腳本作者提供。Daniel 稱(chēng)項(xiàng)目名字中的 &ap
    的頭像 發(fā)表于 04-11 10:02 ?1399次閱讀

    如何編寫(xiě)個(gè)自己的 starter

    前面給大家介紹了 SpringBoot 的自動(dòng)裝配功能,相信大家對(duì)自動(dòng)裝配都有了很好的理解,那么今天阿粉通過(guò)個(gè)示例來(lái)給大家演示下如何編寫(xiě)
    的頭像 發(fā)表于 10-08 14:42 ?1250次閱讀
    如何<b class='flag-5'>編寫(xiě)</b><b class='flag-5'>一</b><b class='flag-5'>個(gè)</b>自己的 starter