女人被爽到高潮视频免cn费95,久久99精品久久久久久久不卡,内射人妻骚骚骚,久久精品一区二区三区四区啪啪 ,美女视频黄频a美女大全

  • 正文
    • 一、前言
    • 二、庫(kù)函數(shù)
    • 三、自定義結(jié)構(gòu)
    • 四、程序流程圖
    • 五、運(yùn)行
    • 六、代碼獲取
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

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

02/10 11:45
1137
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

一、前言

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

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

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

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

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

1. strncasecmp

頭文件

#include<string.h>

函數(shù)定義

int?strncasecmp(const?char?*s1,const?char?*s2,size_t?n);

函數(shù)說明

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

返回值

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

2. strstr

頭文件

#include<string.h>

函數(shù)定義

char?*strstr(?const?char*?str,?const?char*?substr?);

函數(shù)說明

查找 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,?const?char?*delim)

功能

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

參數(shù)

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

返回值

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

4. strncpy

函數(shù)說明

char?*strncpy(char?*dest,?const?char?*src,?size_t?n)

功能

將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?<sys/socket.h>
???????#include?<netinet/in.h>
???????#include?<arpa/inet.h>

函數(shù)聲明

#include?<arpe/inet.h>
int?inet_pton(int?family,?const?char?*strptr,?void?*addrptr);?????

功能:

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

參數(shù)

family:協(xié)議類型既可以是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類型為:struct?in_addr?
typedef?uint32_t?in_addr_t;
struct?in_addr?{
????in_addr_t?s_addr;
};

返回值

若成功則為1,若輸入不是有效的表達(dá)式則為0,
若出錯(cuò)則為-1
const?char?*?inet_ntop(int?family,?const?void?*addrptr,?char?*strptr,?size_t?len);?????

功能

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

返回值

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

6. gethostbyname

函數(shù)的定義

#include?<netdb.h>
struct?hostent?*?gethostbyname(const?char?*?hostname);???

功能

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

參數(shù)

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

返回值

若成功則為非空指針,若出錯(cuò)則為NULL且設(shè)置h_errno
返回的指針類型為:
struct?hostent{
????char?*h_name;??//official?name
????char?**h_aliases;??//alias?list
????int??h_addrtype;??//host?address?type
????int??h_length;??//address?lenght
????char?**h_addr_list;??//address?list
}
DNS服務(wù)器返回的地址就存儲(chǔ)在該結(jié)構(gòu)體

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

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

struct?pro_port{
?char?pro_s[32];
?unsigned?short?port;
};

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

#define?HEAD_FTP_P?"ftp://"
#define?HEAD_FTPS_P?"ftps://"???
#define?HEAD_FTPES_P?"ftpes://"
#define?HEAD_HTTP_P?"http://"
#define?HEAD_HTTPS_P?"https://"


#define?PORT_FTP??21
#define?PORT_FTPS_I??990????//implicit
#define?PORT_FTPS_E??21?????//explicit
#define?PORT_HTTP?80
#define?PORT_HTTPS?443
struct?pro_port?g_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},
};

四、程序流程圖

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

1. parse_url()

int?parse_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)體類型定義如下:
typedef?struct
{
?char?user[MAX_USER_LEN];
?char?pass[MAX_PASS_LEN];
?char?domain[INET_DOMAINSTRLEN];//域名
?char?svr_dir[MAX_PATH_FILE_LEN];?//文件路徑
?char?svr_ip[MAX_IP_STR_LEN];
?int?port;
}URL_RESULT_T;

功能:

解析url字符串,并將解析結(jié)果存放在result中

返回值;

成功返回?URL_OK
失敗返回?URL_ERROR?

2. void remove_quotation_mark()

void?remove_quotation_mark(char?*input)

參數(shù)

input:字符串

功能

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

返回值

3. parse_domain_dir

int??parse_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中用戶名、密碼、域名/ip、文件路徑等信息

返回值

成功:URL_OK
失敗:URL_ERROR

4. check_is_ipv4()

int?check_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()

int?dns_resoulve(char?*svr_ip,const?char?*domain)

參數(shù)

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

功能

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

返回值

成功:URL_OK
失敗:URL_ERROR

五、運(yùn)行

測(cè)試程序

void?main(void)
{
?int?ret;
?
?char?url_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("n-------------result---------------n");

?printf("user:%sn",url_result_t.user);
?printf("pass:%sn",url_result_t.pass);
?printf("port:%dn",url_result_t.port);
?printf("domain:%sn",url_result_t.domain);
?printf("svr_dir:%sn",url_result_t.svr_dir);
?printf("svr_ip:%sn",url_result_t.svr_ip);

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

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

六、代碼獲取

完整代碼可以進(jìn)入我的倉(cāng)庫(kù)獲取 https://gitee.com/yikoulinux/url

相關(guān)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計(jì)資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄

公眾號(hào)『一口Linux』號(hào)主彭老師,擁有15年嵌入式開發(fā)經(jīng)驗(yàn)和培訓(xùn)經(jīng)驗(yàn)。曾任職ZTE,某研究所,華清遠(yuǎn)見教學(xué)總監(jiān)。擁有多篇網(wǎng)絡(luò)協(xié)議相關(guān)專利和軟件著作。精通計(jì)算機(jī)網(wǎng)絡(luò)、Linux系統(tǒng)編程、ARM、Linux驅(qū)動(dòng)、龍芯、物聯(lián)網(wǎng)。原創(chuàng)內(nèi)容基本從實(shí)際項(xiàng)目出發(fā),保持原理+實(shí)踐風(fēng)格,適合Linux驅(qū)動(dòng)新手入門和技術(shù)進(jìn)階。