新聞中心

EEPW首頁(yè) > 手機(jī)與無線通信 > 設(shè)計(jì)應(yīng)用 > 一個(gè)點(diǎn)到點(diǎn)的郵件系統(tǒng)設(shè)計(jì)

一個(gè)點(diǎn)到點(diǎn)的郵件系統(tǒng)設(shè)計(jì)

作者: 時(shí)間:2005-11-24 來源:網(wǎng)絡(luò) 收藏

摘要:簡(jiǎn)單介紹在多功能電話上實(shí)現(xiàn)點(diǎn)郵件收發(fā)系統(tǒng)的技術(shù)和過程。在通信方面,系統(tǒng)使用串口通信,通過Modem用電話號(hào)碼作為收發(fā)者的地址,避免網(wǎng)絡(luò)通信中需要IP地址的問題。在架構(gòu)上,系統(tǒng)分為服務(wù)層和客戶層:服務(wù)層負(fù)責(zé)通信鏈路的建立和數(shù)據(jù)的收發(fā),客戶層負(fù)責(zé)郵件管理和客戶界面,增加了系統(tǒng)的靈活性。由于Modem的傳輸速率有限,好的通信協(xié)議有助于提高郵件的收發(fā)速率,因此結(jié)合現(xiàn)有串口通信協(xié)議的特點(diǎn),并實(shí)現(xiàn)TMP協(xié)議。通過該協(xié)議,郵件收發(fā)系統(tǒng)每秒可以收發(fā)2 KB的郵件數(shù)據(jù)。

關(guān)鍵詞:點(diǎn)到點(diǎn)  串口通信 AT指令

引 言


  大量嵌入式設(shè)備已經(jīng)進(jìn)入人們的日常生活和工作中,人們對(duì)嵌入式設(shè)備的要求越來越高,功能也越來越復(fù)雜。筆者與一個(gè)嵌入式硬件制造商合作,為其嵌入式電話產(chǎn)品建立了一個(gè)軟件系統(tǒng),包括操作系統(tǒng)、驅(qū)動(dòng)程序和一系列應(yīng)用軟件。其中點(diǎn)到點(diǎn)郵件收發(fā)系統(tǒng)是一個(gè)有明顯特色的應(yīng)用。

  本系統(tǒng)是一個(gè)基于串口通信的點(diǎn)到點(diǎn)郵件收發(fā)軟件。運(yùn)行在嵌入式系統(tǒng)上的郵件收發(fā)程序通過Modem以撥號(hào)方式連上遠(yuǎn)端的嵌入式系統(tǒng),然后進(jìn)行郵件發(fā)送工作。系統(tǒng)結(jié)構(gòu)如圖1所示。
   
                 圖1Tmail系統(tǒng)結(jié)構(gòu)

  從用戶角度看,其發(fā)送流程與普通的電子郵件差不多。用戶在編輯好郵件以后,在收信人一欄中填入對(duì)方的電話號(hào)碼,點(diǎn)擊發(fā)送,系統(tǒng)就會(huì)把郵件發(fā)送給對(duì)應(yīng)電話號(hào)碼的遠(yuǎn)端用戶處,當(dāng)然遠(yuǎn)端也必須接有同樣的嵌入式系統(tǒng)。

  系統(tǒng)運(yùn)行在基于ARM的S3C2410芯片嵌入式目標(biāo)板上[1]。操作系統(tǒng)是定制的嵌入式Linux,圖形界面使用Qt/Embedded支持。

1 系統(tǒng)的構(gòu)架

  系統(tǒng)主要由數(shù)據(jù)傳輸、郵件編碼、郵件管理和用戶界面四部分組成。由于要時(shí)刻監(jiān)視串口的狀態(tài),所以系統(tǒng)要一直處于運(yùn)行狀態(tài)。但由于嵌入式系統(tǒng)的內(nèi)存資源和計(jì)算資源有限,要盡量減少程序運(yùn)行時(shí)帶給整個(gè)系統(tǒng)的負(fù)載,采用了兩層的結(jié)構(gòu),分別叫作服務(wù)層和用戶層。服務(wù)層負(fù)責(zé)數(shù)據(jù)傳輸和郵件編碼,用C語言編寫,生成的可執(zhí)行文件較小,一直處于運(yùn)行狀態(tài);用戶層負(fù)責(zé)郵件的管理和用戶界面,用C++配以Qt/Embedded編寫,由于有大量的界面元素,所以其可執(zhí)行文件較大,只有用戶需要查看和發(fā)送郵件時(shí)才運(yùn)行。這樣就可以大大減少占用的資源,使整個(gè)系統(tǒng)具有更快的速度。

  用戶層與服務(wù)層的通信分兩個(gè)方面:一方面,當(dāng)用戶層運(yùn)行時(shí)通過信號(hào)和共享內(nèi)存實(shí)現(xiàn)實(shí)時(shí)通信;另一方面,當(dāng)用戶層沒有運(yùn)行時(shí),用文件暫存收到的郵件,在用戶層運(yùn)行后,再由它通知用戶。

  當(dāng)需要發(fā)送郵件時(shí),用戶層先把本地郵件拷貝到共享內(nèi)存中,然后發(fā)送信號(hào)通知服務(wù)層,服務(wù)層接收到信號(hào)后,把郵件取出、編碼和發(fā)送。在發(fā)送過程中,為了讓用戶看到發(fā)送的進(jìn)度,服務(wù)端把狀態(tài)信息放在共享內(nèi)存中,然后發(fā)送信號(hào)通知用戶層更新狀態(tài)。當(dāng)接收郵件時(shí),若用戶層沒有運(yùn)行,則把收到的郵件解碼后暫存到文件中;若用戶層運(yùn)行著,則服務(wù)層通過共享內(nèi)存和信號(hào)不斷把接收進(jìn)度傳遞給用戶層,使其顯示給用戶,但此時(shí)并不會(huì)把郵件數(shù)據(jù)傳給用戶層,因?yàn)榇藭r(shí)的郵件數(shù)據(jù)是經(jīng)過編碼的,等所有數(shù)據(jù)都接收結(jié)束后,服務(wù)層才會(huì)把郵件解碼成本地郵件,然后再傳送給用戶層保存、顯示。

2 服務(wù)層的設(shè)計(jì)與實(shí)現(xiàn)

2.1 串口的初始化

  在Linux中,串口的設(shè)備文件一般為/dev/ttyS0和/dev/ttyS1,分別表示串口1和串口2。首先要用open命令打開串口,然后根據(jù)具體的應(yīng)用來配置串口,比如設(shè)置波特率、校驗(yàn)方法、數(shù)據(jù)位、停止位和流控制等。

2.2 連接的建立和拆除

  連接的建立過程,就如同一般的撥號(hào)上網(wǎng)過程。不同的只是,撥打的電話號(hào)碼不是ISP的號(hào)碼,而是收信人的號(hào)碼,因此需要在收信人方建立一個(gè)撥號(hào)服務(wù)器,使它能夠接通外來的連接請(qǐng)求。Linux下的pppd軟件可以實(shí)現(xiàn)撥號(hào)功能,mgetty可以用作撥號(hào)服務(wù)器。用pppd和mgetty來建立連接太過奢侈,因?yàn)橹恍杞⑽锢砩线B通的鏈路,而不需要用PPP協(xié)議建立網(wǎng)絡(luò)層鏈路[2]。

  本系統(tǒng)是用AT指令來編寫撥號(hào)和撥號(hào)服務(wù)器代碼的。AT指令是一組對(duì)Modem的操作指令,其中絕大多數(shù)指令都以AT開頭,以/r結(jié)尾[3]。用到的AT指令有:

① 初始化指令――AT;
② 撥號(hào)指令――ATDT電話號(hào)碼;
③ 應(yīng)答指令――ATA;
④ 掛斷指令――+++ATH0。

  工作流程為雙方打開串口并初始化后,都向Modem發(fā)送初始化指令(AT),如果返回“OK”,表示成功。成功后,接入方不斷讀取串口(1次/s)等待“RING”字符串。撥號(hào)方,通過撥號(hào)指令撥打?qū)Ψ诫娫捥?hào)碼,并讀取串口等待“CONNECT”字符串。此時(shí),接入方會(huì)在串口讀到“RING”,然后向串口發(fā)送應(yīng)答指令(ATA),并讀取串口等待“CONNECT”字符串。此后,如果雙方都讀取到“CONNECT”,表示連接已經(jīng)建立,可以在此鏈路上傳輸數(shù)據(jù)。等數(shù)據(jù)傳輸完成后,撥號(hào)方用掛斷指令(+++ATH0)拆除連接。程序的流程如圖2所示。
          
                圖2建立和拆除連接流程

2.3 數(shù)據(jù)傳輸協(xié)議

  現(xiàn)在著名的串口協(xié)議主要有XMODEM和ZMODEM。XMODEM協(xié)議是一種使用撥號(hào)調(diào)制解調(diào)器的個(gè)人計(jì)算機(jī)通信中廣泛使用的異步文件運(yùn)輸協(xié)議。這種協(xié)議以128字節(jié)塊的形式傳輸數(shù)據(jù),并且每個(gè)塊都使用一個(gè)校驗(yàn)和過程來進(jìn)行錯(cuò)誤檢測(cè)。如果接收方關(guān)于一個(gè)塊的校驗(yàn)和與它在發(fā)送方的校驗(yàn)和相同時(shí),接收方就向發(fā)送方發(fā)送一個(gè)認(rèn)可字節(jié)。然而,這種對(duì)每個(gè)塊都進(jìn)行認(rèn)可的策略將導(dǎo)致低性能,特別是具有很長(zhǎng)傳播延遲的衛(wèi)星連接的情況時(shí),問題更加嚴(yán)重[4]。ZMODEM協(xié)議是XMODEM文件傳輸協(xié)議的一種增強(qiáng)形式,它不需要對(duì)每個(gè)塊都進(jìn)行認(rèn)可。事實(shí)上,它只是簡(jiǎn)單地要求對(duì)損壞的塊進(jìn)行重發(fā)。它不僅能傳輸更大的數(shù)據(jù),而且錯(cuò)誤率更小。包含一種名為檢查點(diǎn)重啟的特性,如果通信鏈接在數(shù)據(jù)傳輸過程中中斷,能從斷點(diǎn)處而不是從開始處恢復(fù)傳輸[5]。

  結(jié)合XMODEM和ZMODEM優(yōu)點(diǎn),根據(jù)點(diǎn)到點(diǎn)郵件的特性,設(shè)計(jì)了一個(gè)稱之為TMP(Telephone Mail Protocol)的協(xié)議。

① 郵件發(fā)送方先發(fā)送一個(gè)郵件信息包(其中包括發(fā)送方的電話號(hào)碼和郵件長(zhǎng)度),然后等待接收方應(yīng)答。

② 接收方接收到郵件信息包后,發(fā)送應(yīng)答包,等待郵件內(nèi)容包。

③ 發(fā)送方接收到應(yīng)答包后,開始發(fā)送郵件內(nèi)容,直到郵件發(fā)送完畢或收到重發(fā)包。

④ 接收方接收郵件內(nèi)容包,并檢查其檢驗(yàn)和,如有誤則發(fā)送重發(fā)包,否則一直接收。

⑤ 發(fā)送方若收到重發(fā)包,則根據(jù)重發(fā)包內(nèi)容重發(fā)部分郵件;若郵件發(fā)送完畢,還未收到重發(fā)包,則發(fā)送郵件結(jié)束確認(rèn)包,要求接收方確認(rèn)已正確接收到郵件。

⑥ 接收方接收到郵件結(jié)束確認(rèn)包后,發(fā)送應(yīng)答包,表示自己已正確接收到郵件。

⑦ 發(fā)送方接收到應(yīng)答包后斷開連接。

⑧ 在此過程中,等待都有超時(shí)計(jì)時(shí),一旦超時(shí)就會(huì)斷開連接;接收方接收到錯(cuò)誤的包都會(huì)要求重發(fā),而如果發(fā)送方接收到錯(cuò)誤的包則會(huì)馬上停止發(fā)送,斷開連接。

⑨ 包采用變長(zhǎng)包,最大長(zhǎng)度為128字節(jié),結(jié)構(gòu)為
        
其中:
◇ S為包起始符,取值為0x02,占1字節(jié);
◇ E為包結(jié)束符,取值為0x03,占1字節(jié);
◇ 包號(hào)本為占4字節(jié)的整型,但在傳輸過程中為了防止與包起始和結(jié)束符混淆,把它編成了BCD碼,占8字節(jié);
◇ 包類型也編成了BCD碼,占2字節(jié);
◇ 檢驗(yàn)和是以字節(jié)為單位,把包號(hào)、包類型和數(shù)據(jù)累加起來,然后再編成BCD碼,占2字節(jié);
◇ 數(shù)據(jù)根據(jù)包的類型不同而不同,最多可以有114字節(jié)。

  由于包的判斷只是依靠包起始符和結(jié)束符,包中的其他字段絕對(duì)不能與這兩個(gè)字符相同,所以對(duì)有些可能產(chǎn)生混淆字符的字段進(jìn)行了編碼。

一共有五種類型的數(shù)據(jù)包:

① 郵件內(nèi)容包。包類型為0x00,數(shù)據(jù)是編碼的郵件片斷。

② 郵件信息包。包類型為0x81,數(shù)據(jù)是編成BCD碼的發(fā)送方電話號(hào)碼和郵件長(zhǎng)度。

③ 郵件結(jié)束確認(rèn)包。包類型為0x82,無數(shù)據(jù)。

④ 應(yīng)答包。包類型為0x83,無數(shù)據(jù)。

⑤ 重發(fā)包。包類型為0x84,數(shù)據(jù)是編成BCD碼的新包號(hào)和重發(fā)起始位置。

2.4 包的發(fā)送和接收

  包的發(fā)送和接收就是按照包的格式定義讀寫串口。郵件的收發(fā)過程就是依照TMP協(xié)議收發(fā)包的過程。

2.5郵件的編碼和解碼

  本系統(tǒng)要求發(fā)送的郵件是可以帶附件的。在初始化串口時(shí)使用的是7位數(shù)據(jù),而附件內(nèi)容可能是二進(jìn)制數(shù)據(jù),這和普通電子郵件碰到的問題一樣,要涉及到對(duì)郵件的編碼問題。在設(shè)計(jì)該系統(tǒng)前,已經(jīng)實(shí)現(xiàn)了普通電子郵件的客戶端軟件,所以就把普通電子郵件的編碼方法應(yīng)用到這里,也就是點(diǎn)到點(diǎn)郵件也用MIME格式來編碼[6]。

3 客戶層的設(shè)計(jì)與實(shí)現(xiàn)

3.1 本地郵件的格式

  本地郵件是指起草的、已發(fā)的或收到的存放在各信件箱中的郵件。

  本地郵件可以有兩種存放方式:①按照MIME編碼,把編碼后的郵件放在郵箱中。②按照郵件的組成部分存放在郵箱中。第①種方式的好處是,郵件在發(fā)送前和接收后不需要編碼,另外也不需要備份附件文件,可以加快郵件發(fā)送和接收速度。但它有兩個(gè)最大的缺點(diǎn),一是因?yàn)楦郊紩?huì)編入郵件中,需要大量的存儲(chǔ)空間;二是每次顯示郵件時(shí),都需要把郵件解碼,保存時(shí)還要編碼,需要大量的計(jì)算資源。這兩點(diǎn)對(duì)于資源有限的嵌入式系統(tǒng)來說都是很大的問題。所以這里選擇了第②種方式。
本地郵件是以文本方式存放在文件中的。本地郵件由發(fā)件人、收件人、抄送人、已發(fā)送人、時(shí)間、標(biāo)題、正文、回復(fù)地址和附件九部分組成。在文件中,除正文外其余八部分都各占1行。其中,抄送人和已發(fā)送人可以有多個(gè),之間用分號(hào)隔開,附件部分的每個(gè)附件都有附件名和實(shí)際文件名組成。這兩個(gè)文件名間用斜杠隔開,而不同的附件用分號(hào)隔開。另外,正文放在郵件的最后,與上面八部分之間有一個(gè)空行格開,正文所占行數(shù)以正文內(nèi)容而定。一個(gè)本地郵件如下所示:

Date:2004-08-14
To:67165848
From: 67165762
Cc:67161234;67164321
Sent:67165848;67161234
Subject:peer to peer mailer Test
InReplyTo:67165762
Attachments:logo.png/20040814085700;face.png/200408145701

This is a Tmailer Test!
Hello World!

3.2 郵件箱文件的組織形式

一共有四個(gè)郵件箱,它們分別是:
① 草稿箱(draftbox)――存放起草了但尚未準(zhǔn)備發(fā)送的郵件。
② 發(fā)件箱(sendbox)――存放起草完成,可以發(fā)送的郵件。
③ 已發(fā)郵件箱(sentbox)――存放已發(fā)送出去的郵件。
④ 收件箱(inbox)――存放收到的郵件。

  每個(gè)郵件箱由兩個(gè)文件組成:郵件內(nèi)容文件和郵件索引文件。如草稿箱就有草稿郵件內(nèi)容文件draftbox和草稿郵件索引文件draftbox.index。

  郵件內(nèi)容文件存放的是該郵件箱中的所有郵件,格式如本地郵件所示。郵件索引文件存放的是每個(gè)郵件的基本信息(在顯示郵件列表時(shí)要用的信息)及該郵件在內(nèi)容文件中存放的信息。一個(gè)郵件的索引結(jié)構(gòu)如下所示:
typedef struct {
chardate[40];// 起草、收到或發(fā)出的日期
charfrom[64];// 發(fā)件人或收件人
charsubject[140];// 標(biāo)題
longsize;
// 郵件的大小(在內(nèi)容文件中所占的字節(jié)數(shù))
longposInFile;// 在內(nèi)容文件中的偏移
intflag;// bit0 = 已讀; bit1 = 是否有附件
}mail_summery_t;

  由于索引文件較小,當(dāng)顯示某一郵箱的郵件列表時(shí),可以一次性把整個(gè)索引文件內(nèi)容裝入索引數(shù)組中,因此郵件列表的顯示可以不用讀取郵件內(nèi)容文件,完全取決于索引文件的內(nèi)容。添加郵件時(shí),在內(nèi)容文件末尾添加郵件內(nèi)容,在索引數(shù)組中添加一個(gè)索引記錄;修改郵件時(shí),不管原郵件在內(nèi)容文件中的數(shù)據(jù),在內(nèi)容文件末尾添加郵件內(nèi)容,修改該郵件索引記錄;刪除郵件時(shí),只需刪除索引記錄即可。

  索引文件的使用有兩大好處:一是在顯示郵件列表時(shí)不用從較大的內(nèi)容文件中提取想要顯示的信息;二是方便了郵件的訪問??梢詫?shí)現(xiàn)郵件的隨機(jī)訪問,如果沒有索引文件,在每次修改和刪除郵件時(shí),都需要移動(dòng)大量的數(shù)據(jù)?,F(xiàn)在,雖然會(huì)造成存儲(chǔ)空間的浪費(fèi),但這可以提高速度,對(duì)于資源有限的嵌入式系統(tǒng)很重要。此外,通過定時(shí)判斷郵件內(nèi)容文件的利用率可以壓縮內(nèi)容文件的大小,盡量減少空間的浪費(fèi)。

3.3 附件的管理

  在郵件中,附件較之郵件其他信息很大,所以郵件管理中附件的管理十分重要。

① 用戶在起草郵件并粘貼附件時(shí)要把附件文件備份出來,否則如果用戶不小心把附件文件刪除后再發(fā)送郵件,就不能發(fā)送該附件了。所以要特別開辟出一個(gè)文件夾來存放備份的附件。

② 用戶收到郵件并郵件解碼后,把其所帶的附件保存到特定的文件夾。

③ 用戶在刪除郵件時(shí),也要?jiǎng)h除備份的附件,否則浪費(fèi)空間。

④ 由于附件文件名有可能相同,所以備份附件時(shí)要使用惟一文件名。產(chǎn)生惟一文件名的方法是取當(dāng)前時(shí)間字符串加上一個(gè)隨機(jī)值字符串。

3.4 郵件的抄送

  本系統(tǒng)也實(shí)現(xiàn)了郵件的抄送功能,即一份郵件可以發(fā)給多個(gè)收信人。用戶層程序把郵件內(nèi)容及收信人列表(收件人+抄送人-已發(fā)送人)傳送給服務(wù)層,服務(wù)層程序根據(jù)收信人列表逐個(gè)發(fā)送郵件,并記錄發(fā)送成功的收信人。在給所有收信人都發(fā)送過后(當(dāng)然不一定每個(gè)都成功發(fā)送),返回一個(gè)已發(fā)送成功的收件人列表給客戶層,客戶層把這個(gè)列表添加到本地郵件的sent字段中。當(dāng)郵件的所有收信人,包括收件人和抄送人都收到郵件后,就認(rèn)為該郵件發(fā)送完畢,把它移入已發(fā)送郵件箱。

3.5 界面的設(shè)計(jì)和實(shí)現(xiàn)

Tmailer主要有六個(gè)界面:
① 主菜單對(duì)話框。Tmailer運(yùn)行后就是該界面。界面上有六個(gè)按鈕,分別用于起草郵件,進(jìn)入4個(gè)郵件箱和退出程序。

② 郵件編輯對(duì)話框。用于編輯郵件,主要有收件人、抄送人、標(biāo)題和正文4個(gè)編輯框。

③ 郵件查看對(duì)話框。用于查看收到的郵件,不能編輯。這個(gè)對(duì)話框上有兩個(gè)特殊按鈕,“轉(zhuǎn)發(fā)”按鈕和“回復(fù)”按鈕。當(dāng)點(diǎn)擊“回復(fù)”按鈕時(shí),Tmailer先會(huì)起草一篇新郵件,然后把當(dāng)前郵件的InReplyTo填寫到新郵件的收件人欄中,把當(dāng)前的正文稍作修改填寫到新郵件的正文中,然后就可以編輯和發(fā)送該新郵件了。當(dāng)點(diǎn)擊“轉(zhuǎn)發(fā)”按鈕時(shí),Tmailer也會(huì)先起草一篇新郵件,把當(dāng)前的正文稍作修改填寫到新郵件的正文中,把當(dāng)前附件粘貼到新郵件中,然后只要填上收件人就可以轉(zhuǎn)發(fā)郵件了。

④ 郵件箱對(duì)話框。用于顯示郵件列表和管理郵件。4個(gè)郵件箱共用該界面,不同的郵箱只是個(gè)別按鈕有所不同。當(dāng)選中郵件按下回車鍵后,程序會(huì)根據(jù)當(dāng)前所在的郵件箱選擇用郵件編輯對(duì)話框或郵件查看對(duì)話框顯示選中郵件。對(duì)于有附件的郵件,在每個(gè)郵件前都有一個(gè)標(biāo)記標(biāo)識(shí)。在收件箱中,未打開郵件會(huì)以粗體顯示,打開后就以正常字體顯示。

⑤ 附件編輯對(duì)話框:用于編輯(粘貼和刪除)附件,在郵件編輯對(duì)話框中點(diǎn)擊“附件“按鈕可以打開該對(duì)話框。

⑥ 附件查看對(duì)話框。用于查看和保存接收郵件的附件。如果查看的附件是圖像文件,Tmailer會(huì)通過Qt/Embedded的程序間通信機(jī)制把圖像信息傳遞給圖像顯示程序,讓它來顯示圖像。

結(jié)語

  本文介紹了一個(gè)在嵌入式系統(tǒng)上點(diǎn)到點(diǎn)的設(shè)計(jì)和實(shí)現(xiàn),重點(diǎn)講述了如何在計(jì)算、存儲(chǔ)資源有限的特殊環(huán)境下,來設(shè)計(jì)點(diǎn)通信軟件;如何運(yùn)用AT指令操作Modem;對(duì)具體的應(yīng)用如何來有效地設(shè)計(jì)串口的通信協(xié)議和如何對(duì)郵件進(jìn)行合理有效的管理。本系統(tǒng)已經(jīng)成功地運(yùn)行在一款多功能電話上,將來通過擴(kuò)展還可以增強(qiáng)群發(fā)、定時(shí)發(fā)送等功能。

                  參考文獻(xiàn)
1 Samsung Electronics. S3C2410X 32?Bit Risc Microprocessor User's Manual Revision 1.2, 2003
2 Robert Hart. PPP Howto. http://www.faqs.org/docs/LinuxHowto/PPPHowto.html, 1997
3 Michael R. Sweet. Serial Programming Guide for POSIX Operating Systems(5th Edition). http://digilander.libero.it/robang/rubrica/serial.htm,1999
4 Richard Stevens W. Unix環(huán)境高級(jí)編程. 北京:機(jī)械工業(yè)出版社, 2000
5 Matt Welsh. Linux權(quán)威指南. 第3版. 北京:中國(guó)電力出版社, 2000
金震江:碩士研究生,主要研究方向?yàn)榍度胧较到y(tǒng)。呂強(qiáng):教授,主要研究方向?yàn)橛?jì)算機(jī)操作系統(tǒng)、分布式計(jì)算、計(jì)算語言學(xué)等。褚亞銘:碩士研究生,主要研究方向?yàn)榍度胧讲僮飨到y(tǒng)。楊季文:教授,主要研究方向?yàn)橛?jì)算機(jī)中文信息處理技術(shù)、計(jì)算機(jī)操作系統(tǒng)。

c++相關(guān)文章:c++教程




評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉