全球IP通信联盟论坛技术-精华交流区(本区严禁发广告,请珍惜大家时间,违者屏蔽)解决方案 → 2003開放源碼軟體競賽結案報告書

2010 NexCom Expo & CIPCC [观众注册] 2010年中国IP通信大奖评选 博客最新改版,欢迎建立企业/个人博客 爱立信企业专题
思科统一通信 eSOON企业专题 供求频道最新上线!-免费注册及发布! Avaya统一通信电子书

  共有661人关注过本帖树形打印

主题:2003開放源碼軟體競賽結案報告書

帅哥哟,离线,有人找我吗?
旺旺鲜贝
  1楼 个性首页 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 斑竹
等级:版主 帖子:3238 积分:6188 威望:0 精华:4 注册:2003-7-23 10:51:00
2003開放源碼軟體競賽結案報告書  发帖心情 Post By:2004-8-10 21:34:00

2003開放源碼軟體競賽結案報告書 作者姓名:黃志偉 作品名稱:GNU Gatekeeper - An Open-Sourced H.323 Gatekeeper 參賽組別:?系統組□應用組 創作模式:□個人□集體?社群 電子郵件:cwhuang@linux.org.tw, cwhuang@citron.com.tw 聯絡電話:(O): 0266385960 ext 601      (H): 0228329826      (M): 0953378875 通訊地址:台北市士林區德行西路111巷2弄9號 設計理念說明: 1.計畫簡介 Voice over Internet Protocol (VoIP)意指以IP-based的網路來傳輸聲音甚至影像 的資訊。小至一般公司用來節省電話費用,大至跨國大企業用來連接各地分公司 成為一虛擬辦公室。它的應用正在快速成長當中。 有數個組織為VoIP定義了標準的通訊協定。包括了ITU-T所制定的H.323,由 IETF 所支持的SIP,以及MGCP 和H.248/Megaco等。其中H.323 是最早被標準 化,也是目前最廣被使用的VoIP通訊協定。據估計每個月有超過十億分鐘的話 務量使用H.323協定來傳送(請參見參考資料4)。 H.323定義了一個泛用的通訊架構,底下由H.225.0、H.235、H.245和H.450系 列等子規格所組成。架構中包含了終端(terminal)、閘道器(gateway)、MCU 和 gatekeeper(台灣通常翻譯為閘道管理員,大陸則譯為網守)。Terminal是指使用者 末端的設備;gateway則負責H.323到其它通訊協定的轉換;MCU用在多人多點 通訊會議中。這三者通稱為H.323 的端點(endpoint)。 如下圖所示: Gatekeeper 則是H.323 網路的核心。各種端點都可向gatekeeper 註冊,受 gatekeeper控制並取得服務。例如,gatekeeper可將電話號碼轉換為對應的IP,並 決定那些端點可以撥打那些號碼,可通話多久。一個gatekeeper以及所有向它註 冊的端點構成一個H.323的區域(zone)。Gatekeeper完整的服務列表如下: 地址轉換(Address Translation) 通話管制(Admissions Control) 頻寬控制(Bandwidth Control) 區域管理(Zone Management) 信號管制(Call Control Signaling) 通話認證(Call Authorization) 頻寬管理(Bandwidth Management) 通話管理(Call Management) 本計劃的目的,便是實作一個具有電信運營等級(carrier grade)的開放源碼(GPL) H.323 Gatekeeper。 2.計畫源起 2001年三月我加入呈祺資訊網路公司(Citron Network Inc.)擔任技術長一職。敝 公司是VoIP 系統服務商,即一般所謂的網路電話公司。當時公司的服務系統是 向其它公司購買的封閉系統,問題叢生,難以駕馭,並且無法擴充。由於我在開 放源碼界的長期經驗,深知開放系統所帶來的好處,故積極尋找開放源碼的替代 方案。 當時我找到了兩個開放源碼的Gatekeeper 計畫,分別是由Egoboo 所發起的 圖1. H.323 Zone示意圖 OpenGatekeeper 計畫(採用MPL),以及由Jan Willamowius 所領導的OpenH323 Gatekeeper 計畫(採用GPL,簡稱OpenH323GK)。當時OpenGatekeeper的功能其 實比較完整,使用者也多。而OpenH323GK僅有簡單的RAS 和Q.931 Routed功 能。然而我分別寫信給兩個計畫的作者,尋求合作的可能。OpenH323GK 作者 Jan熱心的回覆我們的需求與疑問,但OpenGatekeeper的作者似乎已停止維護, 也不回應Email。 經過審慎的評估後,我們決定採用OpenH323GK計畫作為我們系統的根基。主 要原因有二: OpenH323GK作者的熱心對當時尚是VoIP和H.323新手的我們來說是個很 大的助力。反之,OpenGatekeeper似乎是個已死的計畫。 OpenH323GK採用GPL,所有的衍生工作都必須開放回饋出來給社群,較 採用MPL的OpenGatekeeper更能夠凝聚開放源碼工作者的能量,加速計畫 的開發與進展。 呈祺資訊加入OpenH323GK的開發,使得該計畫有了長足的進步。我除了改善 程式的穩定性,解決多執行緒(multi-thread)下的衝突問題,並加入包括了H.235 安全認證,Neighboring Gatekeeper,H.323 Proxy和NAT解決方案等重要功能, 使其能處理上萬個註冊數以及數千通同時通話量,滿足電信運營所需的功能。 由於OpenH323 Gatekeeper的名稱和其餘同類型的計畫太過接近。在2002年四 月時我向計畫協調人Jan 提議,並獲得大多數開發者的同意,將計畫名稱改為 GNU Gatekeeper,簡稱GnuGK。2002年八月GnuGK 2.0版正式釋出,獲得VoIP 界的廣大迴響。由於功能穩定強大,許多公司甚至運營商都逐漸採用GnuGK於 重要的場合。2003年七月GnuGK 2.2beta1釋出,是另一個新的里程碑。關於此計 畫的更多歷史源流,請參考附件一。 如今GnuGK計畫在VoIP的社群當中已成為開放源碼的業界標準。至少有超過 二十個公司、組織或個人為GnuGK提供各式的諮詢服務。與GnuGK測試相容的 各式產品超過八十個(參考補充說明2)。各VoIP廠商莫不以通過GnuGK相容測試 作為互通性的保證。 敝公司應用GnuGK提供IP和PSTN雙向互撥服務。目前的客戶數約五千五百 人,每個月的話務量將近六十萬分鐘。 引用軟體表列說明: GnuGK 計畫使用OpenH323 函式庫作為H.323 protocol stack。OpenH323 計畫 是由Equivalence Pty Ltd. 所開發的H.323 protocol stack library,採MPL授權。包 含了兩部份,一個PWLib函式庫,是一個跨平台的C++ library,負責將與作業系 統相關的特性包裝起來。另一即是OpenH323函式庫本身,實作H.323協定的細 節,並包含一個ASN.1 的parser。此外由於PWLib和OpenH323的跨平台特性, GnuGK亦可在多種平台上編譯執行,包括Linux、Windows、FreeBSD和Solaris 等。 由於OpenH323本身採用MPL授權,與GnuGK的GPL授權並不相容。而這個 不相容是由GPL本身所導致的。經由專家的建議後,GnuGK的授權上特別加上 一條「允許與OpenH323函式庫做連結」,以解決兩者授權不相容的問題。 在加密演算法的部份採用了OpenSSL函式庫。另外GnuGK還可使用MySQL、 OpenLDAP和FreeRADIUS等作為後端資料庫。 表列如下: 名稱說明備注 PWLib http://www.openh323.org/ 跨平台C++ 函式庫MPL 授權 OpenH323 http://www.openh323.org/ H.323 protocol stack 的實作MPL 授權 OpenSSL http://www.openssl.org/ 實作SSL 協定的加解密函式庫BSD 式授權 MySQL http://www.mysql.org/ GNU Gatekeeper 後端資料庫之一GPL 授權 OpenLDAP http://www.openldap.org/ GNU Gatekeeper 後端資料庫之一開放源碼 FreeRADIUS http://www.freeradius.org/ RADIUS資料庫之一GPL 授權 創意說明: OpenH323GK(GnuGK前身)原本的程式碼相當鬆散且未妥善規劃。我加入後引 入了許多新的觀念與設計,很大部份幾乎整個重寫。說明加下: 解決多執行緒衝突問題 我重新設計了管理註冊和通話的表格,使其能夠在多執行緒下運作無誤。外 界需透過smarter pointer來存取表格中的記錄。只要有smarter pointer指向某一 記錄,該記錄就不會被意外刪除。Smarter pointer以reference counting技術實 作。只要counter大於零,就表示該記錄仍在使用中,負責cleanup的執行緒便 不會刪除該筆記錄。 避免fork過多的執行緒 在路由模式(routed mode)下gatekeeper處理Q.931 訊息的轉送需要兩個TCP sockets。原本OpenH323GK 會開兩個執行緒分別去讀取兩個sockets,這表示 一個通話至少耗用兩個執行緒。由於一個行程能fork的執行緒有上限,這就限 制了通話的總數。我設計了新的ProxyThread 類別以解決此問題。所有的 sockets會被分配到數個Handler中處理,每個Handler以select系統呼叫偵測 那一個socket有資料可讀,有資料才去讀取並處理。如此每一個Handler thread 都可以處理多個通話。因此執行緒數目上限不會再限制了通話總數。Handler thread的數目可由使用者動態指定。 可擴充的fd_set 做了上述改善後我發現程式仍無法處理超過五百通以上的通話量。經過研究 各種文獻後,發現是由於select系統呼叫使用的fd_set結構預設僅能處理 1024個sockets。我重新設計了可擴充式的fd_set,使得可處理的sockets數目 可在編譯時期指定。在使用./configure時加上—-with-large-fdset=#即可, 例如指定程式可處理的最大socket數目為16384: ./configure –-with-large-fdset=16384 Gatekeeper階層架構 儘管在H.323規格定義上,gatekeeper並非一個端點。但我發現在實務上若 將一個gatekeeper管轄的區域(zone)視為一個端點註冊至別的gatekeeper會非常 的便利。於是加上了GkClient模組,可以將GnuGK模擬成gateway或terminal 註冊至上層gatekeeper。子GK和父GK可相互交換路由,並且做號碼的改寫, 使得每一個註冊在子GK的端點都像直接註冊在父GK一般。如此很容易建立 gatekeeper的階層架構,易於管理與擴充。 彈性的執行緒管理 GnuGK運用多執行緒以簡化程式流程並增進執行效率。然而最大的挑戰在 於如何分配不同的工作至不同的執行緒。在GnuGK 2.0 版(含)之前,每一種工 作定義在不同的執行緒類別中。這種作法雖然簡單,但問題是每增加一種工作 都必須增加對應的執行緒類別。而且或者必須事先fork執行緒以等待事件的發 生,導致浪費資源,或者在事件發生時才fork執行緒,而使得效率不彰。 為解決此問題我在GnuGK 2.2版中引入了新的執行緒管理模式。我們只定義 一種執行緒類別,稱為Worker,並受稱為Agent的singleton物件所管理。所有 工作被封裝在稱為Job的類別中。若要增加一種新的工作,只要衍生自Job類 別並改寫Run虛擬函式即可。要將該工作交由新的執行緒執行時,只要呼叫 Execute函式,Agent會找出一個空閒的Worker的執行該類別定義的虛擬函式 Run。若是沒有空閒的Worker,Agent會僱用(fork)新的Worker執行緒執行該工 作。反正,當一個Worker失業超過一段時間,它便會被解僱(結束該執行緒)。 利用此模型,系統的負載和Worker執行緒數目將會達到平衡。 RAS Type Traits Gatekeeper與端點溝通的訊息稱上RAS。H.323 規格書上定義了32 種RAS 訊息,格式大同小異,理論上程式的處理方式也相近。但由於每種訊息的型態 和對應的屬性不同,難以用共同的程式碼處理。我引入了一種稱為type traits 的C++技術,將每種RAS訊息的相關屬性封裝在一個叫RasInfo<RAS>的類別 中。這樣的類別稱為trait。有了這樣的輔助類別就很容易寫出泛用的程式碼來 處理不同的RAS訊息。例如下列程式碼用來建立任一個RAS請求對應的回絕 (reject)訊息物件: template<class RAS> inline H225_RasMessage & RasPDU<RAS>::BuildReject(unsigned reason) { typedef typename RasInfo<RAS>::RejectTag RejectTag; typedef typename RasInfo<RAS>::RejectType RejectType; m_msg->m_replyRAS.SetTag(RejectTag()); RejectType & reject = m_msg->m_replyRAS; reject.m_requestSeqNum = request.m_requestSeqNum; reject.m_rejectReason.SetTag(reason); ... }


汪健国
Mobile:13911601382
E-mail:wjg145@sohu.com
Msn:wjg145@hotmail.com
QQ:44108398
       支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
旺旺鲜贝
  2楼 个性首页 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 斑竹
等级:版主 帖子:3238 积分:6188 威望:0 精华:4 注册:2003-7-23 10:51:00
  发帖心情 Post By:2004-8-10 21:35:00

NAT解決方案 NAT如今已是被廣泛使用的網路技術,用來解決IP不足的問題。然而H.323 設計上並非NAT friendly,意即一般簡單的網址轉換無法適用於H.323協定。 欲解決此問題一般有兩種作法,一是修改NAT使其具備H.323的轉換能力。另 一是修改通訊協定使其能夠穿越NAT。GnuGK中我完整的實作了兩種技術。 GnuGK可轉送Q.931、H.245、RTP/RTCP以及T.120的訊息。在此模式下通 訊雙方沒有任何直接的流量通過,因此又稱為H.323 Proxy。若將H.323 Proxy 圖2. NAT示意圖 安裝在NAT上即可解決H.323無法穿過NAT的問題。 不過這種作法需要修改NAT本身,在實務上有時不可行。因此我們研發了 新的技術,在不修改NAT的情況下,僅要在gatekeeper和endpoint端略作修改 即可。這個技術包含了幾個重點: 1. 偵測是否NAT端點:GnuGK會比較註冊訊息(RRQ)的來源IP和RRQ本 身包含的callSignalAddress是否相同。若不同的話即表示端點位於NAT 之後。GnuGK 會針對此種端點,將其訊息中包含的IP資訊轉換為NAT IP。 2. RTP/RTCP 的穿越:H.323 使用RTP/RTCP 來傳送聲音或影像資料,而 RTP/RTCP使用UDP。由於一般NAT對UDP的穿越有條件限制。假設某 一端點的IP A,從port B送出封包,經由NAT轉換為IP C,port D,而 目的地是IP X,port Y。一般的條件(port restricted NAT)會要求回送的封 包,來源必須是IP X,port Y,送至IP C,port D。如此NAT才會轉送回 IP A,port B。GnuGK在轉送RTP/RTCP封包時會設法滿足該條件,使得 RTP/RTCP封包可順利穿越NAT。 利用以上兩個技術,已可使一般位於NAT之後的端點直接註冊到GnuGK 並對外撥打電話。然而欲接電話的話,這樣仍不夠。因為H.323 使用TCP 建立通訊連線,但一般NAT無法處理由外至內的TCP請求。因此需要修改 端點,要加上以下兩種技術: 3. Q.931 Penetration:位於NAT之後的端點在註冊成功後,先發起由內至外 的TCP連線至GnuGK,稱為NAT Connection。當其它端點要呼叫該端點 時,GnuGK會利用已存在的NAT Connection傳送Q.931 Setup至該端點。 4. H.245 Reverting:位於NAT之後的端點若送出h245Address以建立H.245 控制通道,GnuGK在收到後,會改發Q.931 Facility startH245的訊息給該 圖3. Q.931 Penetration示意圖 端點。該端點收到後要改從內部向外建立H.245的通道。由於TCP連線 的方向跟原本正常的程序剛好相反,因此稱為反轉(reverting)。 以上兩個技術在業界實屬創新發明。呈祺資訊已在台灣、日本和美國等 地申請專利當中。 規格/使用/設計/測試報告: 1.規格: 平台:Linux, FreeBSD, Solaris, Windows等。 編譯器:UNIX-like 系統:gcc 2.96 or 3.2以上;Windows:VC6以上。 系統記憶體:256MB以上為佳。 硬碟空間:50MB以上為佳。 必須安裝:PWLib-1.2.13, OpenH323-1.9.3 以上。 其它函式庫或程式:可選擇安裝MySQL、OpenLDAP、OpenSSL等。 2.系統設計: 採用多執行緒架構,以平行處理各種請求與不同的工作。程式啟始時,完成初 始化和必要的檢查之後,隨即分支出數個執行緒,處理不同的請求。主執行緒則 成為RasServer,產生RasListener 監聽RAS的請求。 在收到RAS請求後,RasServer 利用物件工廠產生對應的RasMsg物件,並且檢 查是否有某個RAS處理器在等待(攔截)該訊息。若有的話就將該物件交由該處理 器負責;否則,檢查該訊息是否與正在處理中的訊息重複,若是的話將它交給正 在處理重複訊息的執行緒處理;否則,將該物件交給另一(新的)執行緒處理。該 執行緒將呼叫RasMsg物件的Process虛擬函式來處理該訊息。 TCPServer 執行緒處理所有TCP 連線請求,並將之分配到其餘執行緒處理; GkStatus執行緒處理狀態埠(status port)的輸入,分析是否為合法指令並做適當處 理;在信號路由模式下,還會產生一個至數個ProxyHandler執行緒處理信號(call signalling)的改寫與轉送;HouseKeeping執行緒則檢查註冊和通話是否逾時,以及 處理一些資源的回收與清除。 3.安裝方式: GnuGK可在Windows和各種UNIX-like的系統上編譯執行。為簡化起見,以下 所述以Linux平台為主。編譯前需先安裝PWLib和OpenH323函式庫。 解壓縮:tar zxvf gnugk-2.2.tar.gz cd gnugk ./configure make 其中./configure可加上參數以啟用或停用某些功能特性。如要加上RADIUS 支援,可加上--enable-radius參數。輸入./configure --help可以列出所有參 數。最後產生的執行檔位於src/obj_linux_x86_r/gnugk。 4.執行: 首先,建立一設定檔gnugk.ini如下所示: [Gatekeeper::Main] Fourtytwo=42 TimeToLive=600 [RoutedMode] ; call signalling (Q.931) routed GKRouted=1 ; control channel (H.245) routed H245Routed=1 ; use 1721 as the port of call signalling CallSignalPort=1721 [Proxy] Enable=0 [GkStatus::Auth] rule=allow 執行指令 $ ./src/obj_linux_x86_r/gnugk -c gnugk.ini -o gk.log -ttt 表示以gnugk.ini為設定檔(-c所指定),debug level 為3(3個-t),並將訊息記 錄至gk.log(-o所指定)。關於設定檔各種參數的意義和設定方法,請參考附件 二的第四章。 輸入指令 $ telnet localhost 7000 可看到類似如下訊息: Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. Version: Gatekeeper(GNU) Version(2.2beta2) Ext(pthreads=1) Build(Oct 17 2003, 16:38:28) Sys( Linux i686 2.4.20-8smp) Large fd_set(8192) enabled GkStatus: Version(2.0) Ext() Toolkit: Version(1.0) Ext(basic) Startup: Mon, 20 Oct 2003 14:27:41 +0800 Running: 0 days 00:00:17 ; 表示程式執行成功。7000 port是GnuGK預設的狀態埠,可從這裡監看程式運 作的狀態,並控制或調整程式的執行。細節請參考附件二的第五章。 5.測試: 程式執行成功後,可註冊各種H.323端點上去並互撥電話。底下以ohphone這 支程式為例(可從http://www.openh323.org/code.html取得)。這是一支指令列的 H.323客戶端程式,很適合拿來測試用。 首先,註冊兩個端點上去,號碼分別是600和601。開兩個console視窗,分別 輸入下列指令: $ ohphone -g localhost -u 600 --listenport 1800 -l $ ohphone -g localhost -u 601 --listenport 1801 -l 此時可從GnuGK的狀態埠上看到如下訊息,表示註冊成功: GCF|127.0.0.1|600:dialedDigits|terminal; RCF|127.0.0.1:1800|600:dialedDigits|terminal|1635_endp; GCF|127.0.0.1|601:dialedDigits|terminal; RCF|127.0.0.1:1801|601:dialedDigits|terminal|1634_endp; 從600撥打電話給601: Listening interfaces : ALL:1800 Gatekeeper set: cwhuangGK@localhost.localdomain Waiting for incoming calls for "600" Command ? c 601 600 is calling host 601 Command ? Ringing phone for "127.0.0.1" ... 在601的console上按Y表示接電話: Listening interfaces : ALL:1801 Gatekeeper set: cwhuangGK@localhost.localdomain Waiting for incoming calls for "601" Command ? Incoming call from "600 [127.0.0.1]" at Mon, 20 Oct 2003 14:56:15 +0800, answer call (Y/n)? Y Call with "600 [127.0.0.1]" established. Accepting call. 表示電話已接通,可開始講話。在狀態埠上可看到如下訊息: ACF|127.0.0.1:1800|7377_endp|14990|601:dialedDigits|600:dialedDigits|false; ACF|127.0.0.1:1801|7378_endp|14990|601:dialedDigits|600 [127.0.0.1]:h323_ID|true; 在任一ohphone的console上輸入H指令表示掛斷: Command ? H Hanging up call. Command ? Call with "600 [127.0.0.1]" completed, duration 0:11 此時可從狀態埠上看到通話明細(Call Detail Record): CDR|1|84 53 7c 2a 38 01 d8 11 8a ac 00 0c 6e cb e0 42|11|Mon, 20 Oct 2003 14:56:19 +0800 |Mon, 20 Oct 2003 14:56:30 +0800|127.0.0.1:1800|7377_endp|127.0.0.1:1801|7378_endp |601:dialedDigits|600:dialedDigits|cwhuangGK; DCF|127.0.0.1|7377_endp|14990|normalDrop; DCF|127.0.0.1|7378_endp|14990|normalDrop; 更多的使用說明和範例,請參考附件二。 與其它類似軟體的比較: 名稱作者網址是否為開放 源碼軟體 OpenGatekeeper Egoboo http://www.egoboo.com/ http://www.opengatekeeper.org/ 是(MPL) OpenH323Proxy Marco Polci, Roman Skvirsky http://openh323proxy.sourceforge.net/ 是(MPL) OpenGK Equivalence Pty Ltd. http://www.equival.com.au/ http://www.openh323.org/code.html 是(MPL) 說明如下: OpenGatekeeper:由Egoboo公司所主導,具備RAS、Q.931和H.245路由 模式和Neighboring等基本功能。但不含H.235安全認證,也無法連接資料 庫。 OpenH323Proxy:由OpenGatekeeper衍生而來,加上H.323 Proxy的功能。 OpenGK:由開發OpenH323的同一組織Equivalence Pty Ltd.所發展,主要 用來測試OpenH323的RAS stack。功能很陽春。 功能比較如下: 功能OpenGatekeeper OpenH323Proxy OpenGK GnuGK License MPL MPL MPL GPL RAS Y Y Y Y 路由模式 Q.931 H.245 RTP/RTCP FastStart Y Y N N Y Y Y N N N N N Y Y Y Y H.235 N N Y Y Neighboring Y Y N Y GK Hierarchy N N N Y Alternate GK N N N Y CDR N N N Y Status Port N N Y Y Database Backend N N N Y NAT Traversal N N N Y 其他補充說明: 1.附件說明: ? 附件一:檔案icos2003-paper.html,是我在2003開放源碼國際研討會上介 紹GNU Gatekeeper計畫的文件。收錄在ICOS 2003論文集當中。 ? 附件二:檔案manual-zh.html,GNU Gatekeeper使用參考手冊。包含完整 的安裝、使用和設定說明。 2.參考資料 ? GNU Gatekeeper計畫主網站:http://www.gnugk.org/ ? 提供GnuGK各式諮詢服務的公司或個人列表: http://www.gnugk.org/consulting.html ? GnuGK相容設備列表:http://www.gnugk.org/interoperability.html ? 其他應用GnuGK的成功故事:http://www.gnugk.org/gnugk-success.html ? H.323的市場現況:http://www.tmcnet.com/it/0803/0803f-Cisco.htm


汪健国
Mobile:13911601382
E-mail:wjg145@sohu.com
Msn:wjg145@hotmail.com
QQ:44108398
       支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
旺旺鲜贝
  3楼 个性首页 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 斑竹
等级:版主 帖子:3238 积分:6188 威望:0 精华:4 注册:2003-7-23 10:51:00
  发帖心情 Post By:2004-8-11 22:01:00

好东西~~大家来看呀~



汪健国
Mobile:13911601382
E-mail:wjg145@sohu.com
Msn:wjg145@hotmail.com
QQ:44108398
       支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部

返回版面帖子列表

2003開放源碼軟體競賽結案報告書








验证码: 验证码,看不清楚?请点击刷新验证码
签名