對於包是丟棄、廣播或者是繼續路由是通過設定r_type型別來判斷的。
這是在gnustream類中定義的,其中gnustream完成收包、發包、處理包等操作
enum r_type;
通過gnustream::r_type processpacket(gnupacket &, servent *, gnuid &)這個函式來執行處理程序,下面我們就這個函式進行具體的分析:
接收到包時,首先把ttl值遞減,hop值遞增
in.ttl--;
in.hops++;
通過讀取包中的func值來判斷命令的型別(ping/pong/query/queryhit/push),再執行相應處理
switch(in.func)
else
ret = r_route;
收到query訊息,首先應把訊息廣播出去.然後若本機存在query要尋找的頻道,則返回乙個queryhit訊息
注意gnutella中的檔案在peercast中相對應的是乙個頻道,因此檔名相對應的是頻道的id
ret = r_broadcast;
numhits = chanmgr->findchannels(info,hits,16); //info是乙個頻道資訊結構,此時儲存著query訊息中尋找的頻道資訊
for(int i=0; ioutputpacket(hit,true);}
收到queryhit訊息,則表示頻道已找到,加入收聽.若位於防火牆後面,則加上push訊息
if (hit.firewalled) strcat(flstr,"push,");
readhit(data,hit,in.hops,in.id)
其中readhit()中加入收聽的執行語句為
if (info.id.isset())
收到push訊息,則新分配servent類,按giv方式進行傳送
servent *s = servmgr->allocservent();
if (s)
s->initgiv(h,c->info.id);
js 處理接收到的資料
對的我,我們遇到伺服器端傳送過來的資料,第一時間可能想到的是json資料解析,對不對。然而我今天遇到一件麻煩的事情。本來介面文件說的好好的,只傳送形如 即 的json資料。然而,當我信心滿滿想解析該資料的時候 var obj json.parse data 卻得到了object 甚至 unexpec...
接收沒有收到請求,Why
今天在測試之前已經寫好的介面,執行以前能正確啟動的測試 時,響應碼顯示200,但是沒有返回結果。然後在介面入口處寫了輸出語句,也沒有列印出來。這是怎麼了,怎麼就不行了呢?其實,原因很簡單,就是請求被攔截了。專案設計就是在訪問界面前,會對引數進行校驗,只有校驗成功才能進入介面。而我執著於介面和測試 之...
getopt long接收到的引數,試著列印出來
新增的 如下 int retval int ti zjh char tm tm nargv diagassert nargv null diagassert options null diagassert long options null idx may be null printf getopt...