1. 程式人生 > >c http報文頭欄位內容解析小函式

c http報文頭欄位內容解析小函式

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
	   
#define ABS(x) ((x)?(x):(x))

#define SET_TMP_END(tmpc,tmpp,src) {(tmpc)=*(src);(tmpp)=(src);*(src)='\0';}
#define RESTOR_TMP_END(tmpc,tmpp) {*(tmpp)=(tmpc);}

/*假設為一個HHTP報文頭資料*/
char * buf="GET /service/open/nick?users=&callback=jQuery17204034407522995025_1386320955034&_=1386320955173 HTTP/1.1\r\nHost: api.csdn.net.cn\r\nConnection: keep-alive\r\nAccept: */*\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36\r\nReferer: http://bbs.csdn.net/home\r\nAccept-Encoding: gzip,deflate,sdch\r\nAccept-Language: zh-CN,zh;q=0.8\r\nCookie: 6320938.ovid\r\n\r\nHTTP/1.1 200 OK\r\nCache-Control: private\r\nContent-Length: 0";
char url[1024]={0};


char * International_Top_Level_Domain=".com.net.org.gov.edu.mil.biz.name.info.mobi.pro.travel.museum.int.aero.post.rec.asia.arts.firm.nom.store.web";

char * Country_Code_Top_Level_Domain = ".cn.tw.om.hk.ac.ad.ae.af.ag.ai.al.am.an.ao.aq.ar.as.at.au.aw.az.ba.bb.bd.be.bf.bg.bh.bi.bj.bm.bn.bo.br.bs.bt.bv.bw.by.bz.ca.cc.cf.cd.ch.ci.ck.cl.cm.co.cq.cr.cu.cv.cx.cy.cz.de.dj.dk.dm.do.dz.ec.ee.eg.eh.er.es.et.ev.fi.fj.fk.fm.fo.fr.ga.gd.ge.gf.gg.gh.gi.gl.gm.gn.gp.gr.gs.gt.gu.gw.gy.hm.hn.hr.ht.hu.id.ie.il.im.in.io.iq.ir.is.it.jm.jo.jp.je.ke.kg.kh.ki.km.kn.kp.kr.kw.ky.kz.la.lb.lc.li.lk.lr.ls.lt.lu.lv.ly.ma.mc.md.me.mg.mh.mk.ml.mm.mn.mo.mp.mq.mr.ms.mt.mu.mv.mw.mx.my.mz.na.nc.ne.nf.ng.ni.nl.no.np.nr.nt.nu.nz.qa.pa.pe.pf.pg.ph.pk.pl.pm.pn.pr.pt.pw.py.re.rs.ro.ru.rw.sa.sb.sc.sd.se.sg.sh.si.sj.sk.sl.sm.sn.so.sr.st.sv.su.sy.sz.sx.tc.td.tf.tg.th.tj.tk.tl.tm.tn.to.tr.tt.tv.tz.ua.ug.uk.um.us.uy.uz.va.vc.ve.vg.vi.vn.vu.wf.ws.ye.yt.za.zm.zw";
char* get_Second_Level_Domain(char *dest)
{
	
	char * p = NULL;
	char tmpc, *tmpp;
	
	/*過濾頂級域名*/
	p = strrchr(dest, '.');
	if(strlen(p) == 3)
	{
		/*過濾一級國際頂級域名*/
		SET_TMP_END(tmpc,tmpp,p);
		p = strrchr(dest, '.');
		RESTOR_TMP_END(tmpc,tmpp);
	}
	/*過濾二級域名*/
	
	SET_TMP_END(tmpc,tmpp,p);
	p = strrchr(dest, '.');
	RESTOR_TMP_END(tmpc,tmpp);

	return p+1;

}

int main(int argc, char** argv)
{
	char *p = buf;
	char *tbuf0 ;
	char *tbuf1;
	int tk,i;

	if(strlen(p)<15)
	{
		return 0;
	}
	url[0]='\0';
	
	/*判斷每人上\r\n前邊是不是http協議版本號*/
	p = memchr(p,'\r',strlen(p));
	tk = memcmp(p-8, "HTTP/1." ,7);
	if( tk != 0)
	{
		printf("skb is not http!\n");
		return 0;
	}

	p =buf;
	while(1)
	{
		tbuf0 = p;
		p = memchr(tbuf0,'\r',strlen(tbuf0));
		if(*(p+1) == '\n')
		{
			/*判斷是不是報文頭結束\r\n\r\n*/
			if(*(p+2) == '\r')
			{
				break;
			}
			p = p+2;

			
			tk = memcmp(p, "Host:" ,5);
			if( tk == 0)
			{	/*獲取host欄位內容*/
				tbuf0 = p+5;
				tbuf1= memchr(tbuf0,'\r',strlen(tbuf0));
				strncpy(url,p+5,ABS(tbuf1-tbuf0));
				
				printf("%s\n",get_Second_Level_Domain(url));
				
				break;
			}
			/*獲取其他欄位內容
			tk = memcmp(p, "Referer:" ,8);
			if( tk == 0)
			{	
				tbuf0 = p+8;
				tbuf1= memchr(tbuf0,'\r',strlen(tbuf0));
				strncpy(url,p+8,ABS(tbuf1-tbuf0));				
				break;
			}
		
			*/
		}
			
			
	}

	printf("url = %s\n",url);
	return 0;
}

相關推薦

c http報文內容解析函式

#include <stdio.h> #include <stdlib.h> #include <string.h> #define ABS(x) ((x)?(x):(x)) #define SET_TMP_END(tmpc,

vue中的axios.post使用json資料傳輸,出現請求內容型別是不被允許的情況的解決方案

問題描述: 由於restful介面需要在頭部header傳遞兩個欄位: Content-Type: application/json Access-Token: 84c6635800b14e0eba4f7ece65e095a1 但是,在vue.js裡面配置: 執行傳送的時候出現: 意思是

自制工具:CSV程式碼生成器:自動生成CSV檔案對應的C++實體類和型別解析程式碼

更有開發效率地使用CSV檔案 為了更有效率地使用CSV檔案,我製作了一個工具:Code程式碼生成器。 這個工具可以對CSV檔案進行簡單地配置,自動生成這個CSV檔案對應的C++資料結構和欄位型別解析函式程式碼。 工程專案只要加入這些自動生成的程式碼,就可以更方便地使

HTTP首部完全解析

http協議是前端開發人員最常接觸到的網路協議。在開發過程中,尤其是除錯過程中避免不了需要去分析http請求的詳細資訊。在這其中頭部欄位提供的資訊最多,比如通過響應狀態碼我們可以直觀的看到響應的大致狀態。那麼你是否清楚http首部欄位都有哪些,具體含義是什麼,可選值又有哪些呢?看完下面的內容,我相信對於這幾個

C#.net讀取Excel表中的資料時,有些內容(字串、數字)讀取不到的解決辦法

匯入Excel時,會丟失一些手機號,或者固定電話號 問題出在於,他們將資料填入Excel時,有些格式是數值型別,有些是文字型別 當用OLEDB讀取Excel的時候,在Extended Properties中若沒有配置IMEX=1的屬性,微軟的處理機制是將列轉換為同一

HTTP報文內容

文章參考:https://blog.csdn.net/shouwang666666/article/details/70232053/點選開啟連結https://blog.csdn.net/ythunder/article/details/65664309點選開啟連結

JavaWeb中對HTTP報文解析

寫在前面:該文只是開發中的測試DEMO,後期有時間了會繼續總結完善。 package com.keyisoftware.test; import java.io.IOException; import java.io.PrintWriter; import java.ut

HTTP協議Keep-Alive模式詳解和HTTP總結

1、什麼是Keep-Alive模式? 我們知道HTTP協議採用“請求-應答”模式,當使用普通模式,即非KeepAlive模式時,每個請求/應答客戶和伺服器都要新建一個連線,完成 之後立即斷開連線(HTTP協議為無連線的協議);當使用Keep-Alive模式(又稱持久連線

MIME協議(四) -- MIME訊息的

MIME訊息的頭欄位 4.1  Content-Type 對於表示某個具體資源的MIME訊息,它的訊息頭中需要指定資源的資料型別;對於MIME組合訊息,它的訊息頭中需要指定組合關係。具體資源的資料型別和組合訊息的組合關係,都是通過訊息頭中的Content-Type頭欄位來指定的。Content-

c# 中屬性與

今天回頭學習c# 的基礎,看到屬性的定義,忽然明白一個簡單的道理:欄位定義為Private,不需要class 的外部進行訪問,那麼就可以搞個屬性對private 的欄位進行get,set, 還有一個理由就是這個private 的欄位有時是隻讀取的,不允許外部賦值寫入,那麼就只搞個get 的屬性OK了

django淺談 過濾內容

views.py class ConsultRecordModelForm(forms.ModelForm): class Meta: model = ConsultRecord # fields = "__all__" exclude=['delet

C#查詢ACCESS資料庫和時間

查詢表的所有欄位 string.Format("SELECT * FROM{0}", TableName); 查詢表中的一個欄位 在ACCESS中將欄位用CStr()轉換成字串來判斷 string.Format("SELECT* FROM {0} WHERE CStr({1})=

Android 寫民族選擇框時的民族內容

第一種 在java類裡寫的String 陣列: String[] nations = {"漢族", "蒙古族", "回族", "藏族", "維吾爾族", "苗族", "彝族", "壯族", "布依族", "朝鮮族", "滿族", "侗族", "瑤族", "白族", "土家族",

Nginx自定義請求

介紹在nginx中自定義請求頭欄位,並在日誌中展示相關欄位的值:  第一種方法:  1 在代理nginx伺服器配置中增加兩個proxy_set_header欄位,一個iden,一個age,分別賦值為"student","21",我們將來在日誌中看到這兩個常量; server {

sql,內容用逗號分割的字串轉換成多條資料

WITH testtb2 AS ( SELECT A.[TypeClass_ID], A.[temp], CHARINDEX(',', A.[temp]) AS STA, CHARINDEX(','

淺析HTTP首部

    HTTP首部欄位是構成HTTP報文的重要組成部分,在客戶端和伺服器之間以HTTP協議進行通訊的過程中,無論是請求還是響應,它都能夠起到傳遞額外關鍵資訊的作用。     使用首部欄位是為了給瀏覽器和伺服器提供諸如報文大小、使用的語言、接收的字符集、認證資訊等內容。

MySql 新增內容由原提供

今天遇到一個問題,mysql庫表中資料儲存量比較大,導致對於時間的查詢比較慢。資料量100W左右,時間是字串格式,形式是 "yyyy-MM-dd HH:mm:ss"。需要對庫表結構進行改造,改造內容就是在原有庫表基礎上新增一個時間相關的欄位,而內容由原欄位提供。 在網上也查

RFC2616-HTTP1.1-Header Field Definitions(規定部分—譯文)

RFC 2616 Fielding, et al. 14 頭欄位規定   該章節定義了HTTP1.1標準所包含的所有頭欄位的相關語法和含義。實體頭欄位是接收者或者傳送者所涉及到的,並不區分是客戶端還是伺服器所擁有,而是依據是誰傳送或者是誰接受該實體的欄位。 14.1 Accept   Accept請求頭欄位

mysql查詢語句中對內容(補零為例)length()函式獲取某個資料長度

mysql查詢語句中對欄位內容補位(補零為例)length()函式獲取某個欄位資料長度 jakehu      2014 年 4 月 10 日 mysql查詢語句中對欄位內容補位(補零為例)length()函式獲取某個欄位資料長度2014-04-

C#中的屬性,,變數

2018年11月11日 21:57:20 qq_29975021 閱讀數:3 標籤: C#