06 2010 檔案
徹底解密C++寬字符:6、國際化策略(完)
摘要: 硬編碼的硬傷——補救——Windows的策略——Linux的策略——跨平臺策略——gettext策略——更多
閱讀全文
posted @
2010-06-26 19:55 lf426 閱讀(3589) |
評論 (4) 編輯
徹底解密C++寬字符:5、利用fstream轉換
摘要: C++的流和本地化策略集——basic_filebuf——利用fstream實現(xiàn)寬窄轉換
閱讀全文
posted @
2010-06-26 16:40 lf426 閱讀(3116) |
評論 (0) 編輯
徹底解密C++寬字符:4、利用codecvt和use_facet轉換
摘要: locale和facet——codecvt——內部編碼和外部編碼——CodecvtFacet的in()和out()——演示程序源代碼——use_facet
閱讀全文
posted @
2010-06-26 13:39 lf426 閱讀(8814) |
評論 (2) 編輯
徹底解密C++寬字符:3、利用C運行時庫函數(shù)轉換
摘要: std::locale——mbstowcs()和wcstombs()——寬窄轉換函數(shù):string和wstring之間的轉換。
閱讀全文
posted @
2010-06-26 11:17 lf426 閱讀(2989) |
評論 (1) 編輯
徹底解密C++寬字符:2、Unicode和UTF
摘要: Unicode和UCS——Unicode和UTF——UTF-8和Windows GB2312——UTF-16和UCS-2——UTF-32和UCS-4——BOM
閱讀全文
posted @
2010-06-25 21:51 lf426 閱讀(3628) |
評論 (1) 編輯
徹底解密C++寬字符:1、從char到wchar_t
摘要: 從字符到整數(shù)——本地化策略集(locale)——C/C++的編譯策略——寬字符 wchar_t
閱讀全文
posted @
2010-06-25 14:41 lf426 閱讀(21133) |
評論 (6) 編輯
socket 編程入門教程(六)UDP應用:2、UDP版的Echo Client
摘要: 我們將UDP版的doEcho()也設計成返回bool:true表示循環(huán)繼續(xù);false表示關閉客戶端。
閱讀全文
posted @
2010-06-12 12:11 lf426 閱讀(3721) |
評論 (2) 編輯
socket 編程入門教程(六)UDP應用:1、UDP版的Echo Server
摘要: 這里跟TCP有些細微的差別。在TCP中,recv()返回0表示連接正常斷開,而UDP中沒有連接和斷開的概念,recv()或者recvfrom()返回0表示收到一個0字節(jié)大小數(shù)據(jù)的數(shù)據(jù)報。另外,因為TCP是一對一連接的,所以一旦連接上,TCP服務器只能處理來自一個客戶端的echo請求(后面會講到多線程的使用,就可以讓TCP同時處理多個客戶端了);而UDP服務器則可以處理來自任何客戶端的echo請求,為了返回信息到正確的客戶端,我們的策略是,接收一個UDP數(shù)據(jù)包后,馬上刷新發(fā)送目標地址為上一次接收地址,然后再回發(fā)數(shù)據(jù),所以這里每次多了一個重新指定發(fā)送目的地的函數(shù)。
閱讀全文
posted @
2010-06-12 11:16 lf426 閱讀(2496) |
評論 (2) 編輯
socket 編程入門教程(五)UDP原理:5、預讀MSG_PEEK
摘要: 因為UDP是按數(shù)據(jù)包接收的,我們在接收之前并不知道這個數(shù)據(jù)包有多大。一個策略是,我們準備足夠大的應用程序緩存以免出錯,但是這個“足夠大”的概念是建立在我們對傳送的數(shù)據(jù)事先有了解的情況下,比如是我們自己設計服務器端和客戶端并且制定應用層協(xié)議;另外一種策略是,將一個數(shù)據(jù)包的相關信息記錄在數(shù)據(jù)包的前面的一些字節(jié)中,比如說大小,這樣,我們可以通過預讀數(shù)據(jù)包的前面一段,得到這個數(shù)據(jù)包的相關信息,比如說大小,然后再安排緩存。
閱讀全文
posted @
2010-06-11 13:30 lf426 閱讀(5435) |
評論 (1) 編輯
socket 編程入門教程(五)UDP原理:4、“有連接”的UDP
摘要: 雖然UDP是無連接的,但是也可以通過調用connect()將本地的UDP socket FD與一個遠程的UDP socket FD連接起來。
閱讀全文
posted @
2010-06-11 11:51 lf426 閱讀(2197) |
評論 (0) 編輯
socket 編程入門教程(五)UDP原理:3、UDP的系統(tǒng)緩存隊列
摘要: UDP的系統(tǒng)緩存隊列與TCP的相比,有兩點顯著的不同:
1、UDP沒有SendQ。UDP的數(shù)據(jù)包不會被處理,通過調用sendto()(或者在connect()之后也可以調用send())將數(shù)據(jù)直接發(fā)送。
2、UDP的數(shù)據(jù)在緩存隊列中是有邊緣保證的。
閱讀全文
posted @
2010-06-11 11:18 lf426 閱讀(3046) |
評論 (0) 編輯
socket 編程入門教程(五)UDP原理:2、設計UDP client類
摘要: TCP之所以有個服務器,是因為TCP的客戶端只能和自己的服務器端通訊。而UDP的客戶端可以與任何一個UDP端口通訊——只要知道對方的地址(IP地址和UDP端口)就可以發(fā)送數(shù)據(jù)包。
閱讀全文
posted @
2010-06-10 19:37 lf426 閱讀(1730) |
評論 (0) 編輯
socket 編程入門教程(五)UDP原理:1、設計UDP server類
摘要: 人們通常用電話連線來說明TCP協(xié)議,而UDP協(xié)議,則常常用郵遞來做比喻。與TCP有連接的信息傳輸方式不同,UDP協(xié)議被認為是對底層IP協(xié)議簡單的擴展:協(xié)議并不保證每個數(shù)據(jù)包都會到達目的地,也不保證到達的順序,而僅僅就是“盡力”的發(fā)送每一個數(shù)據(jù)包。
閱讀全文
posted @
2010-06-10 12:16 lf426 閱讀(2914) |
評論 (0) 編輯
迭代器(iterator)“擦”(erase)出的錯誤
摘要: 在我們遍歷查找對等值的循環(huán)中,一開始v.end()指向第10個元素(數(shù)值為9)的后面一個位置(不存在的第11個元素的位置)。當?shù)髦赶虻?0個元素(數(shù)值為9)的時候,v.erase()生效運行;下一輪循環(huán)中,迭代器本來應該指向第11個元素的位置,并且等于v.end()并結束循環(huán)。但是,因為我們擦掉了vector中的一個元素,v.end()指向的是現(xiàn)在的最后一個元素——第9個元素的后面,也就是第10個元素的位置。這樣,迭代器到了11,而判斷確是其是否到10,這將永遠無法實現(xiàn),形成了一個邏輯bug,所以系統(tǒng)拋出錯誤了。
閱讀全文
posted @
2010-06-10 11:03 lf426 閱讀(1681) |
評論 (1) 編輯
socket 編程入門教程(四)TCP應用:2、構建echo客戶端
摘要: echo客戶端的工作原理也很簡單:
1、向服務器端發(fā)送一個字符串;
2、接收服務器的返回信息(如果是echo服務器就會返回發(fā)送出去的字符串本身)。
3、在標準輸出中回顯服務器返回的信息。
閱讀全文
posted @
2010-06-08 11:49 lf426 閱讀(2289) |
評論 (1) 編輯
socket 編程入門教程(四)TCP應用:1、構建echo服務器
摘要: echo服務器的工作原理很簡單:
1、接收客戶端傳來的信息;
2、將接收到的信息原封不動的返回給客戶端。
閱讀全文
posted @
2010-06-08 10:56 lf426 閱讀(3205) |
評論 (3) 編輯
socket 編程入門教程(三)TCP原理:7、TCP連接的關閉
摘要: TCP的連接建立需要3次握手,而正常關閉則需要4次握手。
閱讀全文
posted @
2010-06-07 20:58 lf426 閱讀(2949) |
評論 (0) 編輯
socket 編程入門教程(三)TCP原理:6、字節(jié)流的發(fā)送與接收
摘要: 在socket機制中,應用層的程序以send()函數(shù)將數(shù)據(jù)首先發(fā)送到本機系統(tǒng)的發(fā)送緩存中,我們稱之為SendQ,意指這是一個FIFO(先進先出)的隊列。這個緩存是系統(tǒng)決定的,并不是在我們的程序中指定的。然后socket機制負責將SendQ中的數(shù)據(jù)以字節(jié)為單位,按照順序發(fā)送給對方的接收緩存RecvQ中。RecvQ也是一個屬于系統(tǒng)的FIFO緩存隊列。在收信息的另外一邊,當RecvQ沒有數(shù)據(jù)時,recv()就會阻塞(默認情況下),每當有數(shù)據(jù)可接收,recv()就會返回實際接收到的數(shù)據(jù)長度。
閱讀全文
posted @
2010-06-07 20:09 lf426 閱讀(4029) |
評論 (1) 編輯
socket 編程入門教程(三)TCP原理:5、TCP的三次握手(three-way handshake)
摘要: TCP的三次握手過程如下:
1、第一個SYN連接請求由客戶端發(fā)起,這個數(shù)據(jù)報將SYN設置為1表示是一個連接請求,并且包含著這次連接的ISN,我們假設其值為n。
2、服務器端收到第一次握手請求的數(shù)據(jù)報后開始構建反饋的數(shù)據(jù)報。反饋數(shù)據(jù)報包括兩個部分:第一部分是將連接請求的序號反饋回去,因為SYN本身占了一個字節(jié),所以反饋回去的序號就是n+1;第二部分是自己也向客戶端發(fā)起SYN連接請求,也將SYN設置為1,并包含這個新連接的ISN,我們設其值為m。
3、客戶端回應服務器端的SYN連接請求,將服務器端到客戶端連接的序號反饋回去,因為SYN占了一個字節(jié),所以反饋給服務器端的序號是m+1。
閱讀全文
posted @
2010-06-07 13:16 lf426 閱讀(3033) |
評論 (0) 編輯
socket 編程入門教程(三)TCP原理:2、設計TCP socket的類(上)
摘要: socket是一個int的文件描述符(WinSock中直接是一種抽象的描述符),我們通過對這個描述符發(fā)出指令操作socket。這是C語言的思想,在面向對象的思想中,最好socket本身是一種對象,各種方法由對象本身發(fā)出。用面向對象的思想封裝socket并不困難,而且,對于描述socket的概念可能更加直觀,這一節(jié),我們邊介紹socket和TCP的概念邊對socket進行OO封裝。
(上)基類和監(jiān)聽socket。
閱讀全文
posted @
2010-06-06 22:24 lf426 閱讀(3879) |
評論 (1) 編輯
socket 編程入門教程(三)TCP原理:1、socket異常信息
摘要: sokcet本身屬于系統(tǒng)(OS),是系統(tǒng)對TCP/IP的實現(xiàn),也就是說,socket發(fā)出的異常信息不代表程序出錯,甚至不代表系統(tǒng)出錯,而僅僅就是代表socket本身的各種異常情況。
閱讀全文
posted @
2010-06-06 21:07 lf426 閱讀(3968) |
評論 (0) 編輯
用對象的成員函數(shù)引出線程,還是在線程中創(chuàng)建對象?
摘要: 所以,如果我們設想構造一個類,這個類的對象可以調用包含this的線程,那么這個對象一定不能是局部變量,或者說,我們必須在循環(huán)的{}對之前先把這些對象構造出來?;蛘哒f,如果我們希望用類來封裝線程,那么這些可以調用線程的對象必須是全局的。
閱讀全文
posted @
2010-06-05 21:06 lf426 閱讀(802) |
評論 (0) 編輯
在多線程中拋出的異常出錯?
摘要: 所以,一個解決方法是,凡是遇到新的線程,必須在新線程中重新寫異常處理。不然,就如google代碼標準里所說的那樣,不使用C++的異常機制。畢竟C++沒有定義多線程的標準,所以也就無從說起多線程中異常處理的標準。
閱讀全文
posted @
2010-06-05 20:16 lf426 閱讀(2654) |
評論 (2) 編輯
socket 編程入門教程(二)win32下使用socket:WinSock
摘要: 接下來的教程我會兼顧winsock的代碼,這主要是因為winsock本身對socket幾乎是兼容的。所以,這里有必要先說明在VC環(huán)境中使用socket的一些簡單設置,以及與Linux環(huán)境下的細微差別。
閱讀全文
posted @
2010-06-03 10:37 lf426 閱讀(6573) |
評論 (0) 編輯