SDL入門教程
專門為新手準備,一切從零開始
socket 編程入門教程(六)UDP應用:2、UDP版的Echo Client
摘要: 我們將UDP版的doEcho()也設計成返回bool:true表示循環繼續;false表示關閉客戶端。
閱讀全文
posted @
2010-06-12 12:11 lf426 閱讀(3712) |
評論 (2) 編輯
socket 編程入門教程(六)UDP應用:1、UDP版的Echo Server
摘要: 這里跟TCP有些細微的差別。在TCP中,recv()返回0表示連接正常斷開,而UDP中沒有連接和斷開的概念,recv()或者recvfrom()返回0表示收到一個0字節大小數據的數據報。另外,因為TCP是一對一連接的,所以一旦連接上,TCP服務器只能處理來自一個客戶端的echo請求(后面會講到多線程的使用,就可以讓TCP同時處理多個客戶端了);而UDP服務器則可以處理來自任何客戶端的echo請求,為了返回信息到正確的客戶端,我們的策略是,接收一個UDP數據包后,馬上刷新發送目標地址為上一次接收地址,然后再回發數據,所以這里每次多了一個重新指定發送目的地的函數。
閱讀全文
posted @
2010-06-12 11:16 lf426 閱讀(2488) |
評論 (2) 編輯
socket 編程入門教程(五)UDP原理:5、預讀MSG_PEEK
摘要: 因為UDP是按數據包接收的,我們在接收之前并不知道這個數據包有多大。一個策略是,我們準備足夠大的應用程序緩存以免出錯,但是這個“足夠大”的概念是建立在我們對傳送的數據事先有了解的情況下,比如是我們自己設計服務器端和客戶端并且制定應用層協議;另外一種策略是,將一個數據包的相關信息記錄在數據包的前面的一些字節中,比如說大小,這樣,我們可以通過預讀數據包的前面一段,得到這個數據包的相關信息,比如說大小,然后再安排緩存。
閱讀全文
posted @
2010-06-11 13:30 lf426 閱讀(5413) |
評論 (1) 編輯
socket 編程入門教程(五)UDP原理:4、“有連接”的UDP
摘要: 雖然UDP是無連接的,但是也可以通過調用connect()將本地的UDP socket FD與一個遠程的UDP socket FD連接起來。
閱讀全文
posted @
2010-06-11 11:51 lf426 閱讀(2190) |
評論 (0) 編輯
socket 編程入門教程(五)UDP原理:3、UDP的系統緩存隊列
摘要: UDP的系統緩存隊列與TCP的相比,有兩點顯著的不同:
1、UDP沒有SendQ。UDP的數據包不會被處理,通過調用sendto()(或者在connect()之后也可以調用send())將數據直接發送。
2、UDP的數據在緩存隊列中是有邊緣保證的。
閱讀全文
posted @
2010-06-11 11:18 lf426 閱讀(3039) |
評論 (0) 編輯
socket 編程入門教程(五)UDP原理:2、設計UDP client類
摘要: TCP之所以有個服務器,是因為TCP的客戶端只能和自己的服務器端通訊。而UDP的客戶端可以與任何一個UDP端口通訊——只要知道對方的地址(IP地址和UDP端口)就可以發送數據包。
閱讀全文
posted @
2010-06-10 19:37 lf426 閱讀(1724) |
評論 (0) 編輯
socket 編程入門教程(五)UDP原理:1、設計UDP server類
摘要: 人們通常用電話連線來說明TCP協議,而UDP協議,則常常用郵遞來做比喻。與TCP有連接的信息傳輸方式不同,UDP協議被認為是對底層IP協議簡單的擴展:協議并不保證每個數據包都會到達目的地,也不保證到達的順序,而僅僅就是“盡力”的發送每一個數據包。
閱讀全文
posted @
2010-06-10 12:16 lf426 閱讀(2906) |
評論 (0) 編輯
socket 編程入門教程(四)TCP應用:2、構建echo客戶端
摘要: echo客戶端的工作原理也很簡單:
1、向服務器端發送一個字符串;
2、接收服務器的返回信息(如果是echo服務器就會返回發送出去的字符串本身)。
3、在標準輸出中回顯服務器返回的信息。
閱讀全文
posted @
2010-06-08 11:49 lf426 閱讀(2278) |
評論 (1) 編輯
socket 編程入門教程(四)TCP應用:1、構建echo服務器
摘要: echo服務器的工作原理很簡單:
1、接收客戶端傳來的信息;
2、將接收到的信息原封不動的返回給客戶端。
閱讀全文
posted @
2010-06-08 10:56 lf426 閱讀(3195) |
評論 (3) 編輯
socket 編程入門教程(三)TCP原理:7、TCP連接的關閉
摘要: TCP的連接建立需要3次握手,而正常關閉則需要4次握手。
閱讀全文
posted @
2010-06-07 20:58 lf426 閱讀(2944) |
評論 (0) 編輯
socket 編程入門教程(三)TCP原理:6、字節流的發送與接收
摘要: 在socket機制中,應用層的程序以send()函數將數據首先發送到本機系統的發送緩存中,我們稱之為SendQ,意指這是一個FIFO(先進先出)的隊列。這個緩存是系統決定的,并不是在我們的程序中指定的。然后socket機制負責將SendQ中的數據以字節為單位,按照順序發送給對方的接收緩存RecvQ中。RecvQ也是一個屬于系統的FIFO緩存隊列。在收信息的另外一邊,當RecvQ沒有數據時,recv()就會阻塞(默認情況下),每當有數據可接收,recv()就會返回實際接收到的數據長度。
閱讀全文
posted @
2010-06-07 20:09 lf426 閱讀(4023) |
評論 (1) 編輯
socket 編程入門教程(三)TCP原理:5、TCP的三次握手(three-way handshake)
摘要: TCP的三次握手過程如下:
1、第一個SYN連接請求由客戶端發起,這個數據報將SYN設置為1表示是一個連接請求,并且包含著這次連接的ISN,我們假設其值為n。
2、服務器端收到第一次握手請求的數據報后開始構建反饋的數據報。反饋數據報包括兩個部分:第一部分是將連接請求的序號反饋回去,因為SYN本身占了一個字節,所以反饋回去的序號就是n+1;第二部分是自己也向客戶端發起SYN連接請求,也將SYN設置為1,并包含這個新連接的ISN,我們設其值為m。
3、客戶端回應服務器端的SYN連接請求,將服務器端到客戶端連接的序號反饋回去,因為SYN占了一個字節,所以反饋給服務器端的序號是m+1。
閱讀全文
posted @
2010-06-07 13:16 lf426 閱讀(3028) |
評論 (0) 編輯
socket 編程入門教程(三)TCP原理:2、設計TCP socket的類(上)
摘要: socket是一個int的文件描述符(WinSock中直接是一種抽象的描述符),我們通過對這個描述符發出指令操作socket。這是C語言的思想,在面向對象的思想中,最好socket本身是一種對象,各種方法由對象本身發出。用面向對象的思想封裝socket并不困難,而且,對于描述socket的概念可能更加直觀,這一節,我們邊介紹socket和TCP的概念邊對socket進行OO封裝。
(上)基類和監聽socket。
閱讀全文
posted @
2010-06-06 22:24 lf426 閱讀(3872) |
評論 (1) 編輯
socket 編程入門教程(三)TCP原理:1、socket異常信息
摘要: sokcet本身屬于系統(OS),是系統對TCP/IP的實現,也就是說,socket發出的異常信息不代表程序出錯,甚至不代表系統出錯,而僅僅就是代表socket本身的各種異常情況。
閱讀全文
posted @
2010-06-06 21:07 lf426 閱讀(3963) |
評論 (0) 編輯
socket 編程入門教程(二)win32下使用socket:WinSock
摘要: 接下來的教程我會兼顧winsock的代碼,這主要是因為winsock本身對socket幾乎是兼容的。所以,這里有必要先說明在VC環境中使用socket的一些簡單設置,以及與Linux環境下的細微差別。
閱讀全文
posted @
2010-06-03 10:37 lf426 閱讀(6565) |
評論 (0) 編輯
socket 編程入門教程(一)TCP server 端:7、接收與發送
摘要: TCP通訊模型;recv()和send();處理echo行為
閱讀全文
posted @
2008-07-16 12:26 lf426 閱讀(8136) |
評論 (2) 編輯
socket 編程入門教程(一)TCP server 端:6、創建“通訊 ”嵌套字
摘要: 用accept()創建新的socket;accept()的另一面connect();新socket與sockaddr的關系;inet_ntoa()
閱讀全文
posted @
2008-07-15 13:04 lf426 閱讀(4197) |
評論 (0) 編輯
socket 編程入門教程(一)TCP server 端:5、創建監聽嵌套字
摘要: socket和sockaddr的創建是可以相互獨立的;數據流簡易模型(SOCK_STREAM);socket與本機sockaddr的綁定;監聽:listen()
閱讀全文
posted @
2008-07-14 13:02 lf426 閱讀(4597) |
評論 (2) 編輯
socket 編程入門教程(一)TCP server 端:4、構造函數涉及的概念
摘要: 數據封裝(Data Encapsutation);socket()函數;數據的“地址”;網絡字節和本機字節的相互轉換;動作與持續行為
閱讀全文
posted @
2008-07-12 13:27 lf426 閱讀(5139) |
評論 (0) 編輯
socket 編程入門教程(一)TCP server 端:3、sockaddr與sockaddr_in
摘要: 收件人地址;sockaddr和sockaddr_in在Linux中的實現;頭文件依賴關系
閱讀全文
posted @
2008-07-10 15:14 lf426 閱讀(13319) |
評論 (6) 編輯
socket 編程入門教程(一)TCP server 端:2、socket與文件描述符
摘要: UNIX中的一切事物都是文件(everything in Unix is a file!);文件與文件描述符(file & file descriptor);socket與file descriptor
閱讀全文
posted @
2008-07-10 02:42 lf426 閱讀(7969) |
評論 (4) 編輯
socket 編程入門教程(一)TCP server 端:1、建模
摘要: 想象你自己是個小大佬,坐辦公室(什么樣的黑社會做辦公室啊?可能是討債公司吧^^)你很土,只有一個小弟幫你接電話(因為你自己的號碼是不敢對外公開的)。一次通訊的流程大概應該是這樣的:小弟那里的總機電話響了;小弟接起電話;對方說是你女朋友A妹;小弟轉達說,“老大,你馬子電話”;你說,接過來;小弟把電話接給你;你和你女朋友聊天半小時;掛電話。
閱讀全文
posted @
2008-07-08 15:42 lf426 閱讀(12439) |
評論 (8) 編輯
SDL入門教程(十四):1、網絡,嘮叨以及前言
摘要: 第十四章的內容,估計會比較長,也會比較難。我會按照從socket到SDL_net的順序去寫,當然爭取還是做到“零起步”的通俗易懂。這一部分,也會有一個單獨的名字《Linux socket編程入門教程》。
閱讀全文
posted @
2008-07-08 01:18 lf426 閱讀(3448) |
評論 (5) 編輯
SDL在win32與Linux下的一些差別
摘要:
1、在Linux下,TTF_RenderUTF8_Blended 是可以正常渲染簡體中文的。但是不知道為什么,Solid的渲染會報錯,共享(動態鏈接)庫的問題。
2、在Linux下,mid文件用SDL_mixer是打不開的。至少我的情況是這樣,我裝了ALSA的聲卡驅動,不知道還需要做些什么才能放midi。
3、直接裝了ALSA的驅動播放SDL_mixer是有噪音的。解決方法,也是打開Linux下軟件混音(ESD)的方法如下...
閱讀全文
posted @
2008-05-12 01:55 lf426 閱讀(3686) |
評論 (2) 編輯
SDL入門教程(十三):3、封裝多線程
摘要: 我們可以有兩種方法能讓具有普通函數指針(函數指針以及靜態成員函數指針)的函數調用類的私有成員,一是友元函數,另外就是靜態成員函數。而能夠受到類私有保護的,只有靜態成員函數。所以,我們可以通過靜態成員函數調用一個對象數據的形式,實現對于創建多線程函數的封裝。
閱讀全文
posted @
2008-04-28 14:24 lf426 閱讀(2947) |
評論 (2) 編輯
SDL入門教程(十三):2、初識多線程
摘要:
2.1:競爭條件(Race Conditions)
2.2:松開“死咬”的CPU
2.3:GUI線程與worker線程
閱讀全文
posted @
2008-04-28 12:47 lf426 閱讀(6785) |
評論 (0) 編輯
SDL入門教程(十三):1、多線程,從動畫說起
摘要:
1.1:簡單動畫
1.2:動畫函數在主程序中的調用
1.3:創建線程
閱讀全文
posted @
2008-04-26 21:06 lf426 閱讀(3729) |
評論 (0) 編輯
SDL入門教程(十二):音樂和音效
摘要:
1:擴展庫SDL_mixer
2:SDL_mixer的啟動和退出,設計MixSoundClass的基類
3:音效類EffectSound
4:音樂類MusicSound
5:完整的源代碼
閱讀全文
posted @
2008-04-20 11:59 lf426 閱讀(5786) |
評論 (8) 編輯
SDL入門教程(十一):3、做一個對話框
摘要: 有了按鈕類,我們制作對話框就很輕松了……我們使用effectiveClick()方法,一次性的將接收事件,判斷事件,顯示按鈕的不同狀態集成性的完成了。
閱讀全文
posted @
2008-04-19 12:32 lf426 閱讀(3805) |
評論 (2) 編輯
SDL入門教程(十一):2、設計按鈕ButtonClass
摘要:
2.1:設計框架與基類的接口
2.2:鼠標事件判斷與有效點擊
2.3:ButtonClass的源代碼
閱讀全文
posted @
2008-04-19 12:18 lf426 閱讀(3548) |
評論 (0) 編輯
SDL入門教程(十一):1、SurfaceClass類的再設計
摘要:
1.1:為了按鈕做準備
1.2:為SurfaceClass設計基類
1.3:如何深度復制SDL_Surface ?
閱讀全文
posted @
2008-04-17 12:37 lf426 閱讀(2268) |
評論 (0) 編輯
SDL入門教程(十):5、SDL完美顯示中文
摘要:
5.1:構建可以正確顯示中文的SDL_ttf函數
5.2:修改DisplaySurface的類方法
5.3:StringData在主程序中的調用
5.4:本章演示程序和完整源代碼下載
閱讀全文
posted @
2008-03-31 11:59 lf426 閱讀(8356) |
評論 (17) 編輯
SDL入門教程(十):4、用iconv獲得正確的Unicode,使用FriBiDi實現UTF-8到Unicode的正確轉換
摘要:
4.1:為什么iconv不能完全正確的轉換Unicode?
4.2:其它編碼與Unicode之間的雙向轉換,GNU FriBidi
4.3:將漢字,英文,數字和符號都正確的轉換為16位的Unicode
閱讀全文
posted @
2008-03-31 11:00 lf426 閱讀(5527) |
評論 (0) 編輯
SDL入門教程(十):3、字符集之間的轉換,win32下的libiconv
摘要:
3.1:GNU的libiconv項目
3.2:libiconv的演示程序
3.3:iconv的問題。
閱讀全文
posted @
2008-03-30 12:45 lf426 閱讀(3136) |
評論 (0) 編輯
SDL入門教程(十):2、直接通過Unicode讓SDL顯示中文
摘要:
2.1:SDL本身可以顯示中文嗎?
2.2:獲得字符串的Unicode碼
閱讀全文
posted @
2008-03-30 11:34 lf426 閱讀(4211) |
評論 (2) 編輯
SDL入門教程(十):1、多語言支持,Win32下的GetText
摘要:
1.1:po,mo與gettext
1.2:演示程序以及說明
1.3:為源程序制作po文件和mo文件
1.4:設置mo文件的目錄
1.5:構建StringData類
1.6:做個gettext的批處理
閱讀全文
posted @
2008-03-30 02:02 lf426 閱讀(5006) |
評論 (3) 編輯
SDL入門教程(九):5、文本反饋鼠標位置坐標信息
摘要: 注意事項:
1、times.ttf文件請到C:\WINDOWS\Fonts下尋找并拷貝到資源目錄下。
2、如果您使用VC2008,請用Release編譯。原因是,似乎涉及到vector的操作,Runtime Library在debug的時候必須用Multi-theaded Debug DLL (MDd),而Release時候才用Multi-theaded DLL (MD)。而我們親愛的SDL必須始終用MD,所以,請Release吧。
閱讀全文
posted @
2008-03-26 21:20 lf426 閱讀(1650) |
評論 (0) 編輯
SDL入門教程(九):4、int轉換為std::string
摘要: 我下面考慮的問題,是用TextSurface反饋鼠標事件的信息。我想到的第一個例子,很自然就是反饋鼠標所在坐標的位置。這里涉及到一個基礎的問題,即鼠標位置顯然不是用字符串表示的。SDL給我們的反饋信息是int,我們需要用TextSurface將int構建成可以被blit到ScreenSurface上的面,需要做的第一件事情,是將int轉換為string。
閱讀全文
posted @
2008-03-26 20:48 lf426 閱讀(4278) |
評論 (8) 編輯
SDL入門教程(九):3、文本反饋“按鍵”信息
摘要:
3.1:一些小的修改
3.2:回顧SDL事件輪詢
3.3:演示程序
閱讀全文
posted @
2008-03-25 11:56 lf426 閱讀(1847) |
評論 (0) 編輯
SDL入門教程(九):2、顯示文本的完整代碼
摘要: SDL圖形窗口顯示文本的完整代碼
閱讀全文
posted @
2008-03-24 20:31 lf426 閱讀(2345) |
評論 (2) 編輯
SDL入門教程(九):1、在SDL圖形窗口顯示文本
摘要:
1.1:一個小細節,SDL窗口的名稱
1.2:使用*.ttf文件
1.3:構建TextSurface類
閱讀全文
posted @
2008-03-24 20:22 lf426 閱讀(3989) |
評論 (0) 編輯
SDL入門教程(七):SDL摳色(Color Keying)
摘要:
1:什么是摳色(Color Keying)
2:RGB映射
3:添加Surface的類方法,摳色
4:在主程序中使用新的類方法,摳色
閱讀全文
posted @
2008-03-19 20:33 lf426 閱讀(4641) |
評論 (2) 編輯
SDL入門教程(六):SDL讀取其它格式的圖片
摘要:
1:擴充庫(Extension Libraries)
2:更加通用的Display Surface構造函數
3:將圖片修改為適合顯示的格式
閱讀全文
posted @
2008-03-19 11:03 lf426 閱讀(3985) |
評論 (0) 編輯
SDL入門教程(五):6、對C++異常機制的思考,代碼重寫
摘要:
6.1:用bool作為命令是不是畫蛇添足了?
6.2:修改后的代碼。
閱讀全文
posted @
2008-02-22 18:15 lf426 閱讀(2268) |
評論 (0) 編輯
SDL入門教程(五):5、本章范例的完整源代碼
摘要:
5.1:準備工作。
5.2:頭文件SurfaceClass.h
5.3:類方法的實現文件:SurfaceClass.cpp
5.4:演示文件main.cpp
閱讀全文
posted @
2008-02-21 15:22 lf426 閱讀(3047) |
評論 (4) 編輯
SDL入門教程(五):4、讓圖片動起來!
摘要:
4.1:再討論簡單的SDL event響應。
4.2:對于第二種方法的分析。
閱讀全文
posted @
2008-02-21 15:12 lf426 閱讀(3817) |
評論 (2) 編輯
SDL入門教程(五):3、對SDL_BlitSurface()的進一步討論
摘要:
3.1:矩形區域SDL_Rect。
3.2:進一步了解SDL_BlitSurface()。
3.3:為surface類增加新的方法。
閱讀全文
posted @
2008-02-21 14:43 lf426 閱讀(7505) |
評論 (7) 編輯
SDL入門教程(五):2、構建SDL surface類
摘要:
2.1:構建普通的surface類。
2.2:surface的類方法。
閱讀全文
posted @
2008-02-21 13:45 lf426 閱讀(3109) |
評論 (1) 編輯
SDL入門教程(五):1、構建SDL screen surface類
摘要:
1.1:整理兩種SDL_Surface的關系。
1.2:構建SDL screen surface類。
1.3:screen surface的類方法。
閱讀全文
posted @
2008-02-21 13:13 lf426 閱讀(6220) |
評論 (2) 編輯
SDL入門教程(四):3、SDL的軟、硬件渲染的深入試驗和分析
摘要:
3.1:試驗——硬件渲染下關閉雙緩存。
3.2:試驗——單幀硬件渲染下打開雙緩存。
3.3:我們可以直接訪問緩存的地址嗎?
3.4:對于雙緩存現象的另外一種解釋。
閱讀全文
posted @
2008-02-15 17:35 lf426 閱讀(4127) |
評論 (4) 編輯
SDL入門教程(四):2、SDL動畫的硬件渲染(Hardware Render)
摘要:
2.1:需要修改的地方。
2.2:硬件渲染演示程序完整的源代碼。
2.3:問題。
2.4:補充(08-05-13,NV卡dga問題)
閱讀全文
posted @
2008-02-15 16:23 lf426 閱讀(9508) |
評論 (6) 編輯
SDL入門教程(四):1、SDL動畫的軟件渲染(Software Render)
摘要:
1.1:準備工作。
1.2:演示程序的完整源代碼。
1.3:程序改動說明。
閱讀全文
posted @
2008-02-15 15:50 lf426 閱讀(4404) |
評論 (0) 編輯
SDL入門教程(三):3、視頻屬性信息(VideoInfo)
摘要:
3.1:獲取視頻屬性信息。
3.2:我的顯卡不支持硬件加速??!!
3.3:SDL的環境設置。
閱讀全文
posted @
2008-02-10 03:25 lf426 閱讀(7492) |
評論 (6) 編輯
SDL入門教程(三):2、顯示一張BMP位圖。
摘要:
2.1:準備工作。
2.2:創建一個SDL的執行窗口。
2.3:裝載BMP格式的位圖。
2.4:塊移圖面(blit surface)。
2.5:顯示圖片。
2.6:這個例子的完整源代碼。
2.7:補充說明。
閱讀全文
posted @
2008-02-06 01:54 lf426 閱讀(10302) |
評論 (12) 編輯
SDL入門教程(三):1、如何實現按下ESC退出程序?
摘要:
1.1:游戲中的退出習慣。
1.2:事件(event)查詢初探。
1.3:當前窗口。
1.4:一段演示按下ESC(或者點x)退出SDL窗口的程序。
1.5:兩個細節問題。
閱讀全文
posted @
2008-02-04 03:31 lf426 閱讀(8009) |
評論 (13) 編輯
SDL入門教程(二):3、中途裝載與退出,SDL錯誤信息
摘要:
3.1:SDL flags 的中途裝載和中途退出。
3.2:一段用于演示SDL中途裝載和中途退出某些flags的程序。
3.3:SDL的錯誤信息。
閱讀全文
posted @
2008-02-02 22:51 lf426 閱讀(3679) |
評論 (0) 編輯
SDL入門教程(二):2、SDL的安全裝載與安全退出
摘要:
2.1:WasInit可以在Init前使用嗎?
2.2:atexit();
2.3:SDL的退出。
2.4:SDL_Quit(); 的容錯性。
2.5:一段用于演示SDL安全裝載與安全退出的程序。
閱讀全文
posted @
2008-02-02 14:00 lf426 閱讀(4724) |
評論 (1) 編輯
SDL入門教程(二):1、SDL的裝載,位標(flags)
摘要:
1.1:SDL_Init!
1.2:SDL_WasInit?
1.3:一段用于演示flags的程序。
閱讀全文
posted @
2008-02-01 22:40 lf426 閱讀(8179) |
評論 (3) 編輯
SDL入門教程(一):3、MinGW 下的安裝與設置
摘要:
3.1:MinGW 是什么?
3.2:為什么使用MinGW?
3.3:MinGW 的下載和安裝。
3.4:MinGW的簡單使用。
3.5:獲得MinGW下的SDL開發庫。(Development Libraries)
3.6:為MinGW設置SDL庫。
3.7:建立第一個SDL程序。
閱讀全文
posted @
2008-02-01 01:19 lf426 閱讀(18941) |
評論 (10) 編輯
SDL入門教程(一):2、Visual C++ 下的安裝與設置
摘要:
2.1:獲得Visual C++ 2008 Express Edition。
2.2:獲得VC下的SDL開發庫。(Development Libraries)
2.3:為VC設置SDL庫。
2.4:建立VC下使用SDL庫的工程。
2.5:第一個使用SDL的C++程序。
閱讀全文
posted @
2008-01-31 17:19 lf426 閱讀(18442) |
評論 (7) 編輯
SDL入門教程(一):1、一切從零開始
摘要:
1.1:SDL是什么?
1.2:本教程是為誰準備的?
1.3:本教程的寫作計劃?
1.4:我目前的計劃和心愿。
閱讀全文
posted @
2008-01-30 03:30 lf426 閱讀(30884) |
評論 (3) 編輯