當前位置:首頁 » 操作系統 » osp源碼

osp源碼

發布時間: 2022-06-01 14:05:36

⑴ c代碼編程問題,怎樣初始化已定義的結構體

第一章:前言
對於c語言,有人認為它已經落伍了.對於這個問題,仁者見仕,智者見智.的確,c++比c有更強大的諸多優勢.但c++是建立在c之上的.這也是herbert schildt所著的<>在全世界暢銷不衰的原因.更何況,要深入學習linux就必需要有相當的c功底.(這也是我搜集整理本文的根由:-)
現結合個人在編程中的體會,為使新手少走彎路,為老手錦上添花,因此無論你是使用c或c++編程,也無論你是程序設計的初學者還是成熟的專業人員,均會發現,本文將會對你有所收益.當然,我盡力寫得清晰易懂,又不古板.
我愛c.(正如世人愛上帝一樣:-)..

你可以在forum.linuxaid.com.cn上獲得此帖的文本.而其html版本正在趕制之中......

第二章:約定
專業的源程書寫風格.
先看看世界級c大師的源程書寫風格.如 steve maguire 就有許多不錯的建議.

[]倡導使用易於理解的"匈牙利式"的命名約定.
所有的字元變數均以ch開始; 如: char ch_****;
所有的位元組變數均冠以b; 如: byte b_****;
所有的長字變數均冠以l; 如: long l_****;
所有的指針變數均冠以p; 如: char *p_ch_****;
建議類型派生出的基本名字之後加上一個以大寫字母開頭的"標簽".如:
分析 char **ppchmydata;
其讓人一眼就能看出它****一個指向字元指針mydata的指針.
"匈牙利式"命名的最大不足是難念:-(( .但相對於不是總統演講稿的c源程來說,這又算得了什麼?想想看以下的數據命名:
char a,b,c;
long d,e,f;
[]倡導規范書寫.
如果你思如泉湧,而不去也不及顧慮書寫格式,那也沒關系.在將其交出去之前,用cb命令格式化你的源程.雖然源程的格式不會影響到你編譯結果的正確性,但切記,能讓其他的程序員能輕松地閱讀它.否則沒人會理你的.
關於cb命令的更多用法,可以用man cb來參考其手冊頁.
當然除了cb之外,還有更多更好的.但cb是你在任何unix(linux)上都找得到的.更何況它並不差
第三章:開始任務
開始任務之前,先做個深呼吸!
[]其他文檔你准備好了嗎?
你是不是除了c源程之外一無所有了嗎?兵馬未動,糧草先行.你必須先清楚該程序所要完成的功能.在開始寫程序之前,對程序的功能應有規范說明.書寫規范書和確知程序功能的一個方法是先編寫相應的操作手冊.如果你是一人單干,勸你首先寫需求書.切記切記,這對你意味著事半功倍的大好事.
一個實例:我計劃為本行的信貸子功能模塊打一個補丁.我用10周的時間用來寫規劃書,需求書,操作流程,使用說明等等文檔.之後用2周的時間編寫程序,在初步測試(1周)後遞交給各信貸部門測試使用.然後根據反饋的信息再更改相應文檔,並根據文檔修改源程.6個月後發布正式版.
[]一定該遵循ansi標准嗎?
如果你僅使用ansi的標准首標文件,恭喜你,你的程序有著全世界范圍內的廣泛支持和兼容.光明無限.但你必須在通用與專用之間做出取捨,對不起,我幫不了你.
我的原則是:核心用ansi,界面按需而取.這樣在轉換平台時僅需另編用戶界面而已.實用至上嘛.
附:ansi 標准c頭文件

是不是很寒酸?
[]再續前緣?
在得到新任務之後並在開始該新任務之前應馬上回想有哪些是曾經擁有的.舊調重彈遠比另起爐灶來的高效與環保.
[]是否該有自已的庫?
我的答案是應該有自已的特色庫,並與ansi兼容.與3.8不同的是,你僅需在源程序之後附上自已的專用庫就可以了.其次在有了自已的庫後,源碼會很精煉的.不用去羨慕別人了吧.
[]要學會條件編譯.注意你的平台特性.(高手的標志?)
除非你確定你要寫的程序是在某特定的os特定的硬體平台而量身定做.否則應注意數據類型的長度,精度都是不同的,不要想當然.有時甚至是不同的編譯器的差異都要考慮考慮.
....
....(歡迎您來充實此處空白)
....
好了,在任務中,又有哪些細節呢?
[]我是不是葛郎台?
不要那麼吝嗇.在源程序中加入詳盡的注釋以使自己和他人即使在許多年以後仍能讀明白它是什麼樣的程序.
用注釋行分離各個函數.
[]刪除不需要的代碼時要小心.
一個好建議是:使用#ifdef del,而不是簡單地注釋掉甚至是粗暴地直接dd.如果你是使用/* ... */,但一旦要刪除的代碼有很多行,或注釋中以有注釋時,這就可能不那麼好使了.
[]如何給源程序文件命名?
表現特色且不與任何原有應用名相同.一個簡單地方法就是試試看,系統有什麼樣地反應?
[]一次只修改一個地方.
[]一次只編寫一個單一功能的函數。
[]編寫通用程序.
只有當程序編寫完,並且完成了所需要的性能要求之後,再反過頭來優化該程序.
[]不要使用a.out作為結果.你大可以使用與源程相同的可執行文件名.
[]是否一定要用vi編輯?
linux下有許多專用編程編輯器.它們能使你有更高的效率和更低的低級輸入錯誤,但我還是要勸你至少要熟練掌握vi.畢竟vi遍地開花.
[]協同作業.請相信,你不是在孤軍作戰.因此,你有必要熟練掌握一些其它的工具

第四章:使用lint
lint沒有你想像中的那樣糟糕.相反,一旦源程序形成了沒有lint錯誤的形式,將很容易保持下去,並享受到如此而帶來的好處.
[]在cc(gcc)之前就應使用lint.
lint是一語法檢查程序,對於這個多嘴的婆婆來說,你應有足夠的耐心.雖然你知道自已在干什麼,但在cc之前使用lint總是一個好習慣.
[]lint有哪些特色?
在編譯之前使用lint的重要原因是lint不但能發現ansi c中的語法錯誤,而且也能指出潛在的問題或是難於移植於另一機器的代碼問題.除了能指出簡單語法錯誤之外,linut還能基於以下原因指出另外的錯誤:
a.無法達到的語句.
b.沒有進入循環.
c.沒有被使用的變數.
d.函數參數從未使用.
e.沒有賦值之前自動使用參數.
f.函數在有些地方有返回值,但在其他地方不返回.
g.函數調用在不同地方使得參數個數不同.
h.錯誤使用結構指針.
i.模糊使用操作符優先順序.
呵呵呵,挺有用的吧!
[]如何控制lint的輸出?
有時lint會有一大屏一大屏的警告信息.但似乎並未指出錯誤.為了找出潛在的錯誤則需費心費力地瀏覽這些大量的警告信息.
但如果你的程序會分出幾個獨立的模塊,在初級啟動lint時不要用可選項.當對這些模塊進行更改或擴充時,可以忽略與代碼無關的某些警告.為此可用以下選擇項:
-h 對判別是否有錯,類型是否正確不給出啟發式測試.
-v 不管函數中沒有定義的參數
-u 不管被使用的變數和函數沒有定義或定義了但沒有使用.
[]乾脆,在程序中插入指令來影響lint運行.它看樣子有些像注釋.
/*notreached*/ 不可達到的代碼不給信息說明.
/*varargsn*/ 函數的變數個數不作通常的檢查,只檢查開始n個參數的數據類型.
/*nostruct*/ 對下一個表達式不作嚴格類型檢查.
/*argused*/ 下一函數中,不給出沒被使用參數的警告信息.
/*lintlibrary*/ 置於文件的開頭,它將不給出沒被使用函數的警告信息.
關於lint的更多用法,請用man lint來獲知

第五章:使用make
[]什麼是make?
unix(linux)是一個天生的開發平台,我為此感到高興.make是一個強力的工具.它能依賴的源代碼塊並組成一程序,使得很容易建立一可執行程序.make就是這種有依賴關系的部分和代碼之間所作的規格說明.
[] 所有的程序都要使用make?
是的.盡管你只有幾個簡單的模塊,但你需要有一種結構來支持它從簡單走向復雜.除非你的程序已經蓋棺定論.
[]makefile由哪些組成?
makefile由以下幾個部分組成:
注釋.
^^^^
使用#符號插入.make將忽略#之後的任何內容以及其後的return鍵.
變數.
^^^^
make允許定義與shell變數類似的有名變數.比如,你定義了sources=prog.c,那麼該變數的值$(scoures)就包含了源文件名.
依賴關系.
^^^^^^^^
左邊是目標模塊,後接一冒號.再接與該模塊有依賴關系的模塊.
命令.
^^^^
以tab鍵開始(即使用相同數量的空格也不能代替它).
[]makefile示例
下面介紹一個簡單的示例來說明make的用法.假設你的程序有兩個源文件main.c和myc.c,一個位於子目錄include下的頭文件myhead.h,一個庫由****源文件myrout1.c,myrout2.c,myrout3.c產生.
其makefile文件為:
#一個基本的makefile文件.
#其中包括個人的頭文件和個人庫.
headers=include/myhead.h
sources=main.c myc.c
proct=$(home)/bin/tool
lib=myrout.a
libsoures=myrout1.c myrout2.c myrout3.c
cc=cc
cflags=-g
all:$(proct)
$(proct):$(sources)
$(cc)$(cflags) -o $(proct)$(sources)
lint:$(proct)
lint $(sources)$(libsources)
哈哈,挺象shell編程的.如果你與我一樣使用linux下的gcc,那麼只要把上面的cc=cc改為cc=gcc即可.怎麼樣,想來一個更復雜點的嗎?
[]一個更為復雜的makefile
你是否注意到,在上例中,只要啟動make,就會重新編譯所有源代碼.
如果你能看懂以下的makefile,恭喜恭喜,你通關了.
#一個更為復雜的makefile
headers=include/myhead.h
soures=main.c myc.c
objects=main.c myc.c
proct=$(home)/bin/tool
lib=myrout.a
libsources=myrout1.c myrout2.c myrout3.c
libobjects=$(lib)(myrout1.o)$(lib)(myrout2.o)$(lib)(myrout3.o)
include=include
cc=cc
cflags=-g -xc
lint=lint
lintflags=-xc
all:$(proct)
$(proct):$(objects)$(lib)
$(cc)(cflags)-o$(proct)$(objects)$(lib)
.c.o: $(headers)
$(cc)$(cflags) -c i$(include)$<
$(lib):$(headers)$(libsources)
$(cc) $(cflags) -c $(?:.o=.c)
ar rv $(lib) $?
rm $?
.c.c:;
lint: $(proct)
$(lint)$(liniflags)$(sources)$libsources)

第六章:優質無錯編程
親愛的,檢查一下,你是否注意到了以下的細節?也就是說,你是否是一個合格的,能編寫優質無錯代碼的程序員?要永遠記住,編寫無錯代碼是程序員的責任,而不是測試員.(摘錄於本人的"細節頁",因此本節將永遠不會保持完整,歡迎您來充實她)
[]所有程序員至少出現過的一個錯誤:
if(a=3){......}如果a等於3,那麼......
你至少要養成這樣的習慣:當判斷一個變數與一個常量是否相等時,將常量寫在前面.這樣即使你一不小心寫成這樣:if(3=a){......}在cc 之前就可以很容易發現它.
[]老調重彈:邏輯操作符的優先權.
我不願多嘴.總之,如果你一定要編寫如下代碼時:
if(a&0x1&&b&0x2){......}
你的手頭最好有一本詳盡的指南.或者你是這方面的專家.
[]盡量不使用int數據類型.
這僅是一個忠告.你大可使用char,short,long數據類型.若干年以後,當你成長為高手之時,你會發現此時我的良苦用心.
[]對於非整型函數一定要完整定義.
如 long float jisuan(char charr[],int chnum)
{ long float lmydata;
...
...
return(lmydata); }
[]對於非整型函數的輸入要當心.
如 long float lfnum;
...
...
scanf("%lf",&lfnum);
[]float 型的有效數字為7位.當多於7位時,第8位及以後的位將不準確,可以將其定義為long float型.
[]文件的輸入出盡量採用fread fwrite函數.只有當另有用途時才用fprintf fscanf 函數

⑵ eMule有什麼優點

eMule是一個開放的P2P檔案分享軟體,基於eDonkey的網路協議。eMule這個名稱來源於一個動物——騾,所以中文中也稱作電騾或騾子等。

eMule起源

在2002年05月13日一個叫做Merkur的人,他不滿意當時的eDonkey 2000客戶端並且堅信自己能做出更出色的P2P軟體,於是便著手開發。他凝聚了一批原本在其他領域有出色發揮的程序員在他的周圍,eMule工程就此誕生。他的目標是將eDonkey的優點及精華保留下來,並加入新的功能以及使圖形界面變得更好。現在eMule的最新版本是0.47a。

現在eMule已是世界上最大並且最可靠的點對點文檔共享的客戶端軟體。感謝開放源代碼的政策,使許多開發人員能夠對這個工程有所貢獻,從而使發布新版本顯得更有效率。

eMule特色

客戶端使用多個途徑搜索下載的資源,ED2K、來源交換、Kad共同組成一個可靠的網路結構。

eMule的排隊機制和上傳積分系統有助於激勵人們共享並上傳給他人資源,以使自己更容易、更快速地下載自己想要的資源。

eMule是完全免費的。也完全沒有任何的廣告軟體。他們這么做是為了樂趣及知識,而不是為了金錢。

每個下載的文件都會自動檢查是否損壞以確保文件的正確性。(FTP卻不能保證精確復制)

智能損壞控制有助於快速修復損壞的部分。

自動優先權及來源管理系統允許您一次下載許多個資源而無須監視它們。

預覽功能允許您在下載完成之前查看您的視頻文件。

eMule的Web服務特性和Web伺服器允許您快速得從網路存取資料。

能在下載時間里類別以組織和管理文件。

尋找您想要的資源,eMule提供了一個大范圍的搜索方式,包含了:伺服器搜索(本地和全球)、基於Web搜索(Jigle和Filedonkey)及Kad網路(仍在測試)。

eMule還允許您使用非常復雜的布林搜索使搜索更為靈活。

使用信息及好友系統,您能傳送訊息到其他的客戶端並可將他們加為您的好友。有好友上線的話,你就能在您的好友列表中看到他(她)。

使用內建的IRC客戶端, 您能和全世界其他的共享者聊天。

在官方版基礎上,有各種各樣的修改版本(Mod),提供了各種不同的附加功能。並且這些Mod也都是開放源代碼的,這使得eMule的發展突飛猛進。

eMule與其他P2P軟體相比的優點及特色

客戶端使用多個途徑搜索下載的資料源,ED2K、來源交換、Kad共同組成一個可靠的網路結構。

在eMule v0.42及後續版本中,可以使用Kad。

eMule的排隊機制和上傳積分系統有助於激勵人們共享並上傳給他人資源,以使自己更容易、更快速地下載自己想要的資源。

eMule是完全免費的。官方版eMule也完全沒有任何的廣告軟體。

每個下載的文件都會自動檢查是否損壞以確保文件的正確性。(FTP卻不能保證精確復制)

智慧損壞控制有助於快速修復損壞的部分。

自動優先權及來源管理系統允許一次下載許多個資源而無須監視它們。

預覽功能可在下載完成之前查看影片。

eMule的Web服務特性和Web伺服器允許使用者快速得從網路存取資料。

能在下載時間里類別以組織和管理文件。

尋找想要的資源,eMule提供了一個大范圍的搜索方式,包含了:伺服器搜索(本地和全球)、基於Web搜索(Jigle 和 Filedonkey)及Kad網路(仍在測試)。

允許使用非常復雜的布林搜索使搜索更為靈活。

使用信息及好友系統,能傳送訊息到其他的客戶端並可將他們加為好友。有好友上線的話,就能在好友列表中看到他(她)。

使用內建的IRC客戶端, 使用者能和全世界的共享者聊天。

1)P2P到底是什麼?

Peer-to-peer的縮寫,指的是點對點的意思,最早是在美國由 18歲的Shawn Fanning開發出一個叫Napster的軟體時,引入得概念 ,它不僅僅是一種軟體架構,也是一種社會模式的體現,網路上流行的P2P軟體的架構手段主要有兩種:集中式和分布式。

集中式:便是利用伺服器作為媒介使各個分散的節點(用戶)能互相聯系,生成各種服務響應。

分布式:每個節點即做伺服器又做客戶端,這種方式非常靈活,一個孤立的節點只要連上另一個節點便可以進行傳輸。

Napster可以說是第一代p2p軟體。後來由於Napster陷入訴訟危機(相關版權問題),便出現了Gnutella,它吸取了Napster的失敗教訓,將P2P的理念更推進一步:它不存在中樞目錄伺服器,用戶只要安裝了該軟體,立即變成一台能夠提供完整目錄和文件服務的伺服器,並會自動搜尋其它同類伺服器,從而聯成一台由無數PC組成的網路超級伺服器。傳統網路的Server和Client在它的面前被重新定義。Gnutella作為第二代p2p軟體,他們可以說是最早的p2p技術。然後FastTrack (即Kazaa 的底層技術)迅速掘起取代其地位。成為p2p老大。

2)emule到底是什麼?

隨著二代技術的普及,又一個的問題誕生了,自私的人們在利用P2P軟體的時候大多隻願"獲取」,而不願"共享」,P2P的發展遇到了意識的發展瓶頸。不過,一頭"騾」很快改變了游戲規則,它就是後來鼎鼎大名的 eDonkey。這標志著第三代p2p技術的興起,eDonkey採用了以"分散式雜湊表」(distributed hash tables )為訴求的Neonet技術,改變了P2P網路上的搜索方式,理論上可以更有效率的搜索更多的電腦,以及更容易找出少見的文件。這種技術已經使eDonkey基本快要追上了P2P服務龍頭業界的另一個老大Kazaa了. eDonkey由Jed McCaleb在2000年創立。他最重要的是可以同時從許多人那裡下載同一個文件,並且採用了"多源文件傳輸協議」(MFTP,the Multisource FileTransfer Protocol)。電騾的索引伺服器並不集中在一起的,而是各人私有的,遍布全世界,每一個人都可以運行電騾伺服器,同時共享的文件索引為被稱為"ed2k-quicklink」的連接,文件前綴"ED2K://」。同時,在協議中,定義了一系列傳輸、壓縮和打包的標准,甚至還定義了一套積分的標准,你上傳的數據量越大,積分越高,下載的速度也越快。而且每個文件都有有md5-hash的超級鏈接標示,這使得該文件獨一無二,並且在整個網路上都可以追蹤得到。EDonkey可以通過檢索分段從多個用戶那裡下載文件,最終將下載的文件片斷拼成整個文件。而且,只要你得到了一個文件片斷,系統就會把這個片斷共享給大家,盡管通過選項的設置你可以對上傳速度做一些控制,但你無法關閉它。

在eDonkey出現後,其改良品種eMule(電騾)也出現了。可以說emule是eDonkey的升級版,是eDonkey的一個Mod,就象osp就是quake3的mod一樣,它的獨到之處在於開源,它的基本原理和運作方式,也都是基於eDonkey, eMule基於eDonkey網路協議,因此能夠直接登錄eDonkey的各類伺服器。eMule同時也提供了很多eDonkey所沒有的功能,比如可以自動搜索網路中的伺服器、保留搜索結果、與連接用戶交換伺服器地址和文件、優先下載便於預覽的文件頭尾部分等等,這些都使得eMule使用起來更加便利,也讓它得到了電騾的美譽。

總之,他們繼承了第二代P2P無中心、純分布式系統的特點,但他們它不再是簡單的點到點通信,而是更高效、更復雜的網路通信;再加上eDonkey和eMule引入的強制共享機制,在一定程度上避免了前幾代P2P純個人伺服器管理帶來的隨意性和低效率。

3)emule的下載原理?

當你在搜索列表中選取了你要的文件並開始下載後,emule會記錄下這個文件的大小,文件名以及另一個叫做hash的特殊值。會向所有添加的伺服器發出請求,要求得到有相同hash值的文件。而伺服器則返回持有這個文件的用戶信息。這樣我們的客戶端就可以直接的和擁有那個文件的用戶溝通,看看是不是可以從他那裡下載所需的文件。它最棒的部分就在於:你不是只在一個用戶那裡下載文件,而是同時從許多個用戶那裡下載文件。如果另一個用戶僅僅只有你要的文件的一個小小片斷,他也會自動地把這個片斷分享個大家,而你就可以從這個用戶的機器上下載這個片斷。當然你也是一樣。只要你得到了一個文件片斷,系統就會把這個片斷共享給大家。在查找到下載源(其他客戶端)後,下載就是客戶端和客戶端通過點對點(P2P)進行直接對話了。期間沒有數據流通過伺服器。

4)emule是如何工作的?

emule建立於多點文件傳輸協議之上。一個emule網路由伺服器端和客戶端兩部分組成。伺服器端是客戶端連接的、為了搜索和查找可以下載用戶的橋梁。伺服器列表像電話本一樣排列,客戶通過瀏覽它而獲取他需要的文件所有者的客戶端信息。在download過程中,沒有下載文件通過伺服器端。

5)emule是如何搜索的?

每一個客戶端連接到一個伺服器作為他的主伺服器。在連接時,由客戶端告訴主伺服器他share了那些文件,以及IP地址等其他信息。所以每一個伺服器會記錄所有登陸到他伺服器上的以上信息。在本伺服器搜索時,它會通過匹配記錄的已知以上信息把查找結果反饋給搜索的客戶端列表。當你使用擴展搜索(extend search)時,你的搜索請求和應答結果通過發送限制帶寬的UDP包連接到客戶端本身的伺服器列表(server.met)對應的某一個ip地址的伺服器。

6)emule是如何下載的?

當客戶端選擇了一個文件下載時,它首先收集一個擁有該文檔的客戶端的列表。它會先行查詢主伺服器所有登陸用戶他們是否擁有該文件。然後再連接和查選其他伺服器的登陸用戶所擁有該文件的客戶端列表。一旦它找到擁有該文件的其他客戶端,它將請求每個客戶端發送這個文件的不同片。直至最後文件由這個不同的片組裝成一個完整的文件。 在進行pause/resume的時候,我們選擇的下載列表已經獲取,它pause的僅僅是客戶端和客戶端之間的TCP連接然後恢復TCP連接。這個過程只有再resume時通過客戶端向伺服器端發送22個位元組後即可。佔用的僅僅是22個位元組的網路流量。在pause是甚至不通過你登陸的伺服器進行,也無須你登陸的主伺服器進行任何干預和操作。所以說,它並未佔用主服務什麼資源,只是在你已經和主伺服器連接的通道上發送22個位元組而已。

7)emule有什麼優點?

不需要伺服器來存放共享文件,節省了伺服器架設、海量硬碟、網路帶寬。 每個用戶端節點都同時是文件下載者和提供者。實際上,在你正在下載但還沒當完整個文件時,你已經可以把你已下載的部分共享給別人了! 因為emule同時從很多文件提供者那裡下載所需的文件最後再拼成整個文件的。加入的人越多,下載速度越快,資源越豐富。 共享方便,每個人在自已的emule里指定一個share目錄就可以把自己的文件共享給網路中的其它人了。不必再辛苦地上傳到伺服器上了。

以上就是關於emule的一些基礎知識,希望大家看完之後,能對emule的原理,有一個本質的認識。

下面我再來說說一些很困擾,很迷惑人的問題。

1)id問題

朋友們最關心的就是這個問題,id是什麼?id其實沒有什麼用,id就是在emule傳輸裡面,作為地址作用的一個東西,起到定址和定址作用,它直接和我們ip掛鉤,是由emule根據我們的ip地址,通過演算法得到的一組數字。所以adsl用戶經常會說,為什麼我的id變了?當然要變,因為你每次上網撥號所取得的ip地址都不相同,所以id當然也要隨之變化,一句話;ip不變id就不變,ip變了id就變化。

關於高id和低id,目前好多朋友也存在一個誤區,認為同一個ip地址,只能而且最多隻能擁有一個高id,其實這是不對的。一個公網ip地址,可以同時取得2個以上的高id,這一點我要在這里強調一下,比如,adsl用戶,如果你本身是高id,那麼你可以同時打開第二個emule兩個同時運行,但是彼此的emule埠一定不要相同,這樣你會發現兩個都是高id,同一個ip地址。同樣對於埠映射,同一個ip地址,也可以同時取得兩個以上高id,同樣埠不要相同。

對於低id用戶,還存在一個誤區,那就是認為只要映射了,就能變成高id,這一點我要說明一下,什麼叫高id,它是一個9位以上的id數字,它代表了你的ip地址是公網獨立的ip,也就是說只有前提你能夠擁有公網獨立的ip地址,你才能獲得高id,埠映射的原理是把你的內網地址和埠,通過地址轉換投影到公網干線上,使你作為一個公網節點,從而變成高id。那麼這里就存在一個網路拓撲的問題,有些低id用戶,不是處在公網干線的一級子網內,而是子網的下一級子網,甚至下好幾級子網,拓撲的結構是層層拓撲,那麼這部分用戶,無論如何也無法獲得高id,因為你做了映射只不過是成了上一級子網的節點,但是仍然還是內網,只不過映射了一層,你上面還有好幾層,所以要正確看待映射的問題。目前,國內除了電信和網通,有好多二級運營商玩的就是這個路子,他們或者層層拓撲,或者只保留部分公網ip地址,作為機動分配,這樣你運氣好一撥號能得到一個公網ip,你運氣不好就是內網,沒有辦法。

3)kad問題

好多朋友對這個東西始終不太明白,我說一下,kad和我們目前的ed2k不一樣,我們目前的ed2k要通過伺服器進行中轉,我們都要連到服務上才能進行傳輸,而kad則是無伺服器工作模式,它的傳輸可以獨立進行,完全不需要伺服器參與,我們只需要打開kad就可以不再需要伺服器了,所以說kad是屬於試驗階段,應該說他的前景最為光明,應該是p2p的未來,所以建議朋友們多多打開,對於找源很有幫助,特別是對於低id而言,vkad就是vnn+kad的模式。

4)伺服器問題

這個問題論壇已經說了很多了,我主要說一些大家容易誤會的地方,好多朋友經常問到,怎麼我的伺服器少了,或者是消失了,或者開機提示列表文件丟失,這里大家要注意在emule>選項>伺服器設置裡面 啟用智能lowid檢測這一項最好不要選 啟動自動更新伺服器列表也不要選 把連接到其它伺服器時自動更新選上,這樣你可以在伺服器切換的時候,自動更新伺服器列表 而不用添加什麼列表的url網址之類的東西,另外對於常用的伺服器,最好把他的狀態選擇為靜態伺服器,這樣他就不會消失了,其實我們伺服器列表有300多個伺服器,能夠用上的就那麼幾個,大家可以把他們設置成高級,靜態,另外還要說一點,選擇伺服器的時候選擇ping值小的 人數多的 文件多的 這個文件數什麼意思,是連接到這個伺服器的所有用戶的共享文件總數,要注意伺服器上沒有任何文件,另外大家注意一下伺服器列表裡面,每個伺服器還有:軟性文件限制 硬性文件限制, 這個是什麼意思?他代表了伺服器接受你的共享文件 任務列表文件的大小限制,如果你要是超過了這個限制,就會被伺服器拒絕,舉個例子,如果這個值顯示的是1k,那麼你的共享文件數最好少於1000個,目前來看大部分都是1k。

其實對於伺服器端,有好多願意研究的朋友,很感興趣。其實他就是edonkey的伺服器,二者目前列表都一樣,所以大家想要自己架設em伺服器,可以上edonkey網站,下載伺服器端的程序,我看了一下這個程序不大,而且也很簡單,有興趣的朋友們可以自己分析一下。

5)web伺服器問題

大家都看了在emule>伺服器>我的信息 最下面總是有一個web伺服器的東西,這個是什麼?我說一下 通常情況下我們這個禁用是正常的,Web伺服器的作用是提供了遠程訪問eMule的功能,我們可以先在emule端配置一些相關參數,然後可以實現遠程利用ie來對emule進行控制,當然了需要我們emule端要有獨立的訪問地址,遠程式控制制emule可以實現emule的大部分功能,但是不是全部功能,還是有一些限制。另外對於emule端的web設置,懂行的朋友還可以自己進行編程,很有交互性,一般來講,我們什麼時候能夠用上它呢?比如我們在公司開了emule,但是還想下班後繼續在家裡操作公司的emule,那麼我們就可以使用這個功能,如此還有許多場合和環境特別利於web功能的使用,但是要注意隨之帶來的有關網路安全性問題也很重要。對於這個功能的使用,要是詳細寫出來的話,要很長需要專門的一個主題說明,由於篇幅限制,我在這里先簡單說一下,如果朋友們都比較感興趣,我考慮單獨寫一個主題詳細說明具體設置和用法。不再贅述。

6)emule日誌問題

其實這個問題沒什麼好說的,日誌就是記載了emule的運行記錄,我要強調的是好多朋友不懂得利用它,其實大部分emule遇到問題的時候,我們如果仔細注意日誌記錄,都會自己找到問題原因所在,如果你不懂你可以把它復制下來,發到網上,希望各位朋友以後多多注意emule的日誌記錄,遇到問題,多半能都自己解決。

7)任務下載問題

對於這個問題,我想說得是大家要學會使用給任務分優先順序來控制下載順序,經常有許多朋友抱怨,為什麼任務結束一個,開始下一個的時候是隨機開始,怎麼能實現自動控制?這里我們就可以手動設置任務列表裡面任務的優先順序,右鍵就可以看到,把不同任務的優先順序設置成高 中 低 這樣emule在完成一個的時候自然按照優先順序去選擇下一個該是誰,而不會隨機開始了,另外在選項裡面也可以設置一下,新建任務為停止模式,或者自動開始下一個停止文件。

8)搜索問題

其實要是大家都學會了利用該功能,就會找到好多意想不到的東西,好多朋友平時很少用這個功能,其實p2p引以為自豪的就是他的搜索功能,建議大家以後多多自己搜索,搜索的時候要注意,每頁都有200條的限制,所以要想看更多的可以點擊旁邊的"更多」,這樣可以顯示下一個200條,可不要以為就只有第一頁的200條記錄啊!對於搜索顏色問題我說明一下:

紅色:代表你的任務列表裡面已經有的文件 或者 你已經下載完成正在共享的文件

藍色:普及程度較高源比較多的文件

黑色:你從來都沒有下載過的文件

9)共享文件問題

這個我說明一個問題,emule 裡面規定共享的單個文件,注意是"單個」文件不可以超過4g,如果超過了,則不可以進行hash,所以大家注意一下。

10)emule消息問題

經常有朋友會受到You Was Banned!!! Banreason: You use a Leecher Mod

或者Defcon Old Leecherdetection之類的消息,這是什麼意思?

有些朋友以為是有人要聊天,發送過來的消息,其實誤會了,這是自動發送的信息,它的意思是你用的版本是吸血的版本。你已經被ban。對於這個消息,大家可以不用理會,用emule消息過濾,把它過濾掉就可以了,為什麼會如此呢?這個要是說起來也話長了,頗有點傳奇色彩。我簡單說說,部分mod版本呢,由於加分設置不同,逐漸分成不同的派別,這樣逐漸形成了一些小圈子,後來搞出來一個所謂吸血的東西,只下載不上傳,或是該版本群體上傳遠遠小於下載,等等這裡面有好多淵源,後來官方公開封禁了一些,再後來自然被封的不服,然後就是妖魔和反妖魔大家互相封禁,互相職責,後來斗爭擴大化,導致其他版本也跟著遭殃,我們就是屬於被誤傷的,現在這種爭斗仍然在繼續,而且波及越來越廣,這就是我對這個消息的原因的簡單解釋,好多內幕的東西,說起來挺多,不多說了。

11)代理問題

這里我要說明一點,好多朋友使用代理運行emule,比如一些公司內網的朋友,你們在尋找代理的時候,盡量使用sock5的代理,當然sock4和http也可以,但是要注意好多http代理本身不支持udp協議,所以導致了emule無法運行,大家要注意,選擇支持udp協議的代理。而且多找幾個,留作備用。

12)統計信息問題

這個問題,我要說兩點

(1)上傳:下載比例問題 之前好多朋友對這個有很多誤會,這里我要說明這個比例大於1說明你的貢獻大於索取,等於1,說明你的貢獻和索取一致。小於1,則說明了你是一個索取的人,對p2p的貢獻為負。大家一定要注意誰比誰,哪個是分母,哪個是分子,那麼這有什麼用呢?要注意p2p是一個講究奉獻,講究積分的東西,你的上傳多,你的下載快,這個比例也說明了使用者素質問題,另外對於這個比例,我們也有一些獎懲措施,比如 上傳:下載大於2,也就是說明了你的上傳量是下載量的2倍,這個時候你在排隊的時候,就可以享受優先排隊待遇,這個比值越大越好,不存在什麼限制,越大說明你的上傳量越多,說明你的積分越多,你的貢獻越多,當然你排隊的時間就越少。如果這個比值小於1,而且越來越小,那麼同樣你的速度也會越來越慢,這個你怨不了誰。

(2)速度大小的問題 好多朋友往往只關注了那個最大速度,但是實際上那個數值沒有什麼意義,他只是一個曲線峰值,往往一閃即逝,或者最多持續幾秒,我們要關注的是我們的平均速度,這個二元值包含了時間的因素,所以他才能說明我們emule的整體速度大小。

13)積分問題

積分不是你對所有人的積分,只是在你機器下載的人他們的EM對你的積分,比如你開放的帶寬大,小A在你那裡下的很舒服,你就在小A那裡的分數高。同樣,小A那裡也有一群人在下他的資料其中也有你,由於你開放的帶寬多小A在你那裡下的多,你在小A那裡的積分就高,你就比其他在小A那裡下載東西的人有優先下載小A資料的許可權(小A可以設置高、普通這些的,設置高的時候就只有積分高的人優先下了)。

自己是無法看自己的積分的,因為這個積分不是永恆的,只是暫時針對一個文件的。

14)好友通道問題

我說明一點,加為好友開通通道,起到的作用只是,可以縮短你的排隊時間,使你的信用積分突然變大,此外沒有任何作用,他和速度沒有本質的聯系。

15)tag問題

好多朋友到現在也不明白為什麼要有個[chn]有個[VeryCD],這個有什麼用,其實這個名稱是任意的,甚至重名都沒有問題,因為p2p世界裡面判斷你的標志是userhash,而不是用戶名,用戶名你隨便改,一天一個新名字也不會影響你的積分,tag的作用是為了讓一些伺服器判斷,從而可以連接該伺服器,有的伺服器就是規定了如果你不加[*****]就是不讓你連接,所以就加上他連接方便點,另外有的mod可以實現對有相關[****]進行加分,比如我們vc版本對有[chn]的朋友就有固定的加分設置,它可以使所有有這個[chn]的朋友積分比沒有這個的人多,從而達到中國人優先下載優先上傳的問題,當然了這個問題,現在在世界范圍內,仍是一個爭論的話題,到底是否應該加分,大家也是眾說紛紜。其實,懂行的朋友可以自己設置加分,可以隨心所欲給任何[*****]加分減分,也可以給任意userhash加分減分,以達到優先上傳優先下載的目的,甚至可以達到任意ban人的目的。當然了,這個問題不合適公開討論,有違背p2p的根本,這里點到為止。

16)對於如何隱藏emule頭像的問題

對於一些在公司工作的朋友,這一直是一個困擾很久的問題,如何還能下載,還不讓老闆發現。這里我說兩個解決方案

(1)使用第三方軟體解決 可以使用SysTrayX軟體,這個軟體,國內大型軟體站都有下載,它是一個管理系統托盤的軟體,非常簡單,具體使用方法,大家一看就明白了,他可以做到隱藏emule頭像的問題,

(2)使用系統服務解決 我們知道在2000以上系統中都有srvany服務,藉助這個服務,也可以實現隱藏頭像 不藉助第三方軟體 同樣server系統可以用終端服務來實現隱藏頭像,另外還可以藉助instsrv服務來實現隱藏頭像,原理和前面一樣,其實就是一個東西,這種方法原理,常見於一些黑客網站,其實有些木馬軟體,或者後台軟體,就是用的這個方案。大家有興趣可以上一些黑客網站研究研究。

17)關於emule和bt的相關問題

好多朋友都在使用bt的同時,也在使用emule,我這里說一點,對於bt文件,如果我們下到了一半,沒有種了,或者非常慢,我們可以把它導入emule下載,用dmTorrent2Par和Jcd2Met或者 Edonkeydoctor或者MetFileRegenerator,都可以實現該功能,很簡單,另外emule的文件同樣也可以導入bt進行下載,二者可以相互轉換。為什麼要說這一點呢,是要提醒大家,其實有好多emule的輔助工具,都可以幫我們更好的使用emule,它不是孤立的,只不過國內興起的比較晚,目前來看,只要edonkey能用的相關軟體,emule都能使用。比如,關於重建met的edonkeydoctor軟體,就可以使一些下載了很多的錯誤文件,直接進行修復而不是像以前那樣把辛苦下到的刪掉。是我們遇到問題需要關閉的時候,不用再擔心要刪除文件了

⑶ C#怎樣實現語音聊天視頻功能(要具體代碼)

給你一個winform 的例子,對你可能有用!

涉及技術
動態調用Com對象(全反射、沒有引用com ocx)
取得系統存在的各種語言引擎
使用引擎進行朗讀
使用引擎進行保存聲音

程序圖列:

主要功能描述
實列變數等,構造函授等

取得所有的 識別對象模塊集合,放入下拉框

代碼

object _spVoiceCls =
null; //保存朗讀用的 SAPI.SpVoice

const
int SpFlags =
1; //SpeechVoiceSpeakFlags.SVSFlagsAsyn

object _oISpeechObjectTokens =
null; //保存 SAPI.ISpeechObjectTokens 就是系統有的語音引擎集合

int TokensCount =
0; // 語音引擎集合 數
DictionaryEntry[] _deTokens=null; //榜定下拉框用的

public MainForm()
{
InitializeComponent();
this.HandleDestroyed +=
new EventHandler(Form1_HandleDestroyed);
}

private
void Form1_Load(object sender, EventArgs e)
{

InitSAPI();

}

系統事件:程序載入

取得所有的 識別對象模塊集合,放入下拉框

代碼

void InitSAPI()
{
//創建語音對象朗讀用
_spVoiceCls = CreateComObject("SAPI.SpVoice");

if (_spVoiceCls == null)
{

MessageBox.Show("您的系統沒有,微軟語音組件");
Application.Exit();
}
else
{//取得所有的 識別對象模塊集合

_oISpeechObjectTokens = CallComMethod("GetVoices", _spVoiceCls); //取得SAPI.ISpeechObjectTokens
//識別對象集合 Count;
object r = GetComPropery("Count", _oISpeechObjectTokens);
if (r is int)
{

TokensCount = (int)r;

if (TokensCount > 0)
{
//取得全部語音識別對象模塊,及名稱,以被以後使用
_deTokens = new DictionaryEntry[TokensCount];
for (int i = 0; i < TokensCount; i++)
{
//從集合中取出單個 識別對象模塊
object oSpObjectToken = CallComMethod("Item", _oISpeechObjectTokens, i); //返回 SAPI.SpObjectToken
//取名稱
string Description = CallComMethod("GetDescription", oSpObjectToken) as string;
//放到 DictionaryEntry 對象中,key 是 識別對象模塊,value 是名稱
_deTokens= new DictionaryEntry(oSpObjectToken, Description);

}
//邦定到 下拉框
cboxTokens.DisplayMember = "Value";
cboxTokens.ValueMember = "Key";
cboxTokens.DataSource = _deTokens;
cboxTokens.SelectedIndex = 0;
}

}

}

}

用戶事件:朗讀

朗讀輸入的文本信息

代碼

private void btnSynthesis_Click(object sender, EventArgs e)
{
string msg = rTxtMsg.Text.Trim();
if (msg.Length != 0)
{

if (_spVoiceCls != null)
{

//設置語言引擎
SetComProperty("Voice", _spVoiceCls, cboxTokens.SelectedValue);
//調用Speak 函數,msg 是要播放的文本,1 是非同步播放,因為是非同步的 com 對象不立刻釋放
CallComMethod("Speak", _spVoiceCls, msg, SpFlags);

}
}

}

用戶事件:保存聲音

將輸入的文本信息生成音頻文件保存到文件

代碼

private void Save()
{
string msg = rTxtMsg.Text.Trim();
if (msg.Length != 0)
{
using (SaveFileDialog sfd = new SaveFileDialog())
{
sfd.Filter = "wav 文件 (*.wav)|*.wav";
sfd.RestoreDirectory = true;
if (sfd.ShowDialog() == DialogResult.OK)
{
/*
Enum SpeechStreamFileMode;
SSFMOpenForRead = 0;
SSFMOpenReadWrite = 1;
SSFMCreate = 2;
SSFMCreateForWrite = 3;

*/

int SpFileMode = 3;// SpeechStreamFileMode.SSFMCreateForWrite

object oSpFileStream = CreateComObject("SAPI.SpFileStream"); //創建 SAPI.SpFileStream

object oSpVoice = CreateComObject("SAPI.SpVoice"); //創建 SAPI.SpVoice

try
{
CallComMethod("Open", oSpFileStream, sfd.FileName, SpFileMode, false); //打開流
SetComProperty("Voice", oSpVoice, cboxTokens.SelectedValue); //設置 Voice 屬性,讓誰朗讀
SetComProperty("AudioOutputStream", oSpVoice, oSpFileStream); //設置流

CallComMethod("Speak", oSpVoice, msg, SpFlags); //調用 Speak

CallComMethod("WaitUntilDone", oSpVoice, Timeout.Infinite); //等
CallComMethod("Close", oSpFileStream); //關閉流

MessageBox.Show("保存成功");
}
finally
{
Marshal.ReleaseComObject(oSpVoice);
Marshal.ReleaseComObject(oSpFileStream);
}

}

}
}

}
private void btnSave_Click(object sender, EventArgs e)
{

try
{
btnSave.Enabled = false;
Save();

}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
btnSave.Enabled = true;
}

}

調用com組件,功能函數

自己寫的一些幫助函數可以方便調用反射,要不太郁悶(如果是VB 就不用如此費盡了)

#region 調用com組件,功能通用函數
/// <summary>
/// 設置屬性
/// </summary>
/// <param name="name"></param>
/// <param name="o"></param>
/// <param name="vlaue"></param>
private static void SetComProperty(string name, object o, object vlaue)
{
Type t = o.GetType();
t.InvokeMember(name, BindingFlags.Instance | BindingFlags.SetProperty, null, o, new
object[] { vlaue });
}
/// <summary>
/// 取得屬性
/// </summary>
/// <param name="name"></param>
/// <param name="o"></param>
/// <returns></returns>
private static object GetComPropery(string name, object o)
{
Type t = o.GetType();
return t.InvokeMember(name, BindingFlags.Instance | BindingFlags.GetProperty, null, o, null);
}
/// <summary>
/// 調用方法函授
/// </summary>
/// <param name="name"></param>
/// <param name="o"></param>
/// <param name="parms"></param>
/// <returns></returns>
private static object CallComMethod(string name, object o, params object[] parms)
{
Type t = o.GetType();

return t.InvokeMember(name, BindingFlags.Instance | BindingFlags.InvokeMethod, null, o, parms);
}
/// <summary>
/// 創建 com 對象
/// </summary>
/// <param name="FromProgID"></param>
/// <returns></returns>
private static object CreateComObject(string FromProgID)
{
Type comType = Type.GetTypeFromProgID(FromProgID);
object rVar = null;
if (comType != null)
rVar = System.Activator.CreateInstance(comType);

return rVar;
}
#endregion

釋放com對象
很簡單的就一行即可

代碼
void Form1_HandleDestroyed(object sender, EventArgs e)
{
//釋放com對象
Marshal.ReleaseComObject(_spVoiceCls);

}

熱點內容
博越存儲異常 發布:2025-01-11 01:24:31 瀏覽:916
我的世界還原中國伺服器版圖 發布:2025-01-11 01:18:45 瀏覽:382
pythonopenasfile 發布:2025-01-11 01:17:06 瀏覽:971
hbasejavaapi 發布:2025-01-11 01:11:09 瀏覽:744
我的世界pe版飢餓伺服器 發布:2025-01-11 01:09:39 瀏覽:485
異構資料庫數據同步 發布:2025-01-11 01:09:04 瀏覽:957
c語言三角波 發布:2025-01-11 01:02:11 瀏覽:78
php正則轉義 發布:2025-01-11 01:00:03 瀏覽:691
手拉的箱包上的密碼鎖一般是多少 發布:2025-01-11 00:59:55 瀏覽:8
oppo手機系統更新密碼是多少 發布:2025-01-11 00:56:55 瀏覽:87