MFC對SOCKET程式設計的支援其實是很充分的,然而其文件是語焉不詳的。以至於大多數用VC編寫的功能稍
複雜的網路程式,還是使用API的。故CAsyncSocket及CSocket事實上成為疑難,群眾多敬而遠之。餘
好事者也,不忍資源浪費,特為之註解。一、CAsyncSocket與CSocket的區別前者是非同步通訊,後者是同步通訊;前者是非阻塞模式,後者是阻塞模式。另外,非同步非阻塞模式有
時也被稱為長連線,同步阻塞模式則被稱為短連線。為了更明白地講清楚兩者的區別,舉個例子:設想你是一位體育老師,需要測驗100位同學的400米成績。你當然不會讓100位同學一起起跑,因為當
同學們返回終點時,你根本來不及掐表記錄各位同學的成績。如果你每次讓一位同學起跑並等待他回到終點你記下成績後再讓下一位起跑,直到所有同學都跑完。恭
喜你,你已經掌握了同步阻塞模式。你設計了一個函式,傳入引數是學生號和起跑時間,返回值是到達終點的時間。你呼叫該函式100次,
就能完成這次測驗任務。這個函式是同步的,因為只要你呼叫它,就能得到結果;這個函式也是阻塞的,
因為你一旦呼叫它,就必須等待,直到它給你結果,不能去幹其他事情。如果你一邊每隔10秒讓一位同學起跑,直到所有同學出發完畢;另一邊每有一個同學回到終點就記錄成
績,直到所有同學都跑完。恭喜你,你已經掌握了非同步非阻塞模式。你設計了兩個函式,其中一個函式記錄起跑時間和學生號,該函式你會主動呼叫100次;另一個函式記
錄到達時間和學生號,該函式是一個事件驅動的callback函式,當有同學到達終點時,你會被動呼叫。
你主動呼叫的函式是非同步的,因為你呼叫它,它並不會告訴你結果;這個函式也是非阻塞的,因為你一
旦呼叫它,它就馬上返回,你不用等待就可以再次呼叫它。但僅僅將這個函式呼叫100次,你並沒有完
成你的測驗任務,你還需要被動等待呼叫另一個函式100次。當然,你馬上就會意識到,同步阻塞模式的效率明顯低於非同步非阻塞模式。那麼,誰還會使用同步阻塞
模式呢?不錯,非同步模式效率高,但更麻煩,你一邊要記錄起跑同學的資料,一邊要記錄到達同學的資料,而且
同學們回到終點的次序與起跑的次序並不相同,所以你還要不停地在你的成績冊上查詢學生號。忙亂之
中你往往會張冠李戴。你可能會想出更聰明的辦法:你帶了很多塊秒錶,讓同學們分組互相測驗。恭喜你!你已經掌握了多線
程同步模式!每個拿秒錶的同學都可以獨立呼叫你的同步函式,這樣既不容易出錯,效率也大大提高,只要秒錶足夠
多,同步的效率也能達到甚至超過非同步。可以理解,你現的問題可能是:既然多執行緒同步既快又好,非同步模式還有存在的必要嗎?很遺憾,非同步模式依然非常重要,因為在很多情況下,你拿不出很多秒錶。你需要通訊的對端系統可能
只允許你建立一個SOCKET連線,很多金融、電信行業的大型業務系統都如此要求。現在,你應該已經明白了:CAsyncSocket用於在少量連線時,處理大批量無步驟依賴性的業務。CSocket
用於處理步驟依賴性業務,或在可多連線時配合多執行緒使用。
二、CAsyncSocket非同步機制當你獲得了一個非同步連線後,實際上你掃除了傳送動作與接收動作之間的依賴性。所以你隨時可以發包,
也隨時可能收到包。傳送、接收函式都是非同步非阻塞的,頃刻就能返回,所以收發交錯進行著,你可以
一直工作,保持很高的效率。但是,正因為傳送、接收函式都是非同步非阻塞的,所以僅呼叫它們並不能
保障傳送或接收的完成。例如傳送函式Send,呼叫它可能有4種結果:1、錯誤,Send()==SOCKET_ERROR,GetLastError()!=WSAEWOULDBLOCK,這種情況可能由各種網路問題導
致,你需要馬上決定是放棄本次操作,還是啟用某種對策2、忙,Send()==SOCKET_ERROR,GetLastError()!=WSAEWOULDBLOCK,導致這種情況的原因是,你的傳送
複雜的網路程式,還是使用API的。故CAsyncSocket及CSocket事實上成為疑難,群眾多敬而遠之。餘
好事者也,不忍資源浪費,特為之註解。一、CAsyncSocket與CSocket的區別前者是非同步通訊,後者是同步通訊;前者是非阻塞模式,後者是阻塞模式。另外,非同步非阻塞模式有
時也被稱為長連線,同步阻塞模式則被稱為短連線。為了更明白地講清楚兩者的區別,舉個例子:設想你是一位體育老師,需要測驗100位同學的400米成績。你當然不會讓100位同學一起起跑,因為當
同學們返回終點時,你根本來不及掐表記錄各位同學的成績。如果你每次讓一位同學起跑並等待他回到終點你記下成績後再讓下一位起跑,直到所有同學都跑完。恭
喜你,你已經掌握了同步阻塞模式。你設計了一個函式,傳入引數是學生號和起跑時間,返回值是到達終點的時間。你呼叫該函式100次,
就能完成這次測驗任務。這個函式是同步的,因為只要你呼叫它,就能得到結果;這個函式也是阻塞的,
因為你一旦呼叫它,就必須等待,直到它給你結果,不能去幹其他事情。如果你一邊每隔10秒讓一位同學起跑,直到所有同學出發完畢;另一邊每有一個同學回到終點就記錄成
績,直到所有同學都跑完。恭喜你,你已經掌握了非同步非阻塞模式。你設計了兩個函式,其中一個函式記錄起跑時間和學生號,該函式你會主動呼叫100次;另一個函式記
錄到達時間和學生號,該函式是一個事件驅動的callback函式,當有同學到達終點時,你會被動呼叫。
你主動呼叫的函式是非同步的,因為你呼叫它,它並不會告訴你結果;這個函式也是非阻塞的,因為你一
旦呼叫它,它就馬上返回,你不用等待就可以再次呼叫它。但僅僅將這個函式呼叫100次,你並沒有完
成你的測驗任務,你還需要被動等待呼叫另一個函式100次。當然,你馬上就會意識到,同步阻塞模式的效率明顯低於非同步非阻塞模式。那麼,誰還會使用同步阻塞
模式呢?不錯,非同步模式效率高,但更麻煩,你一邊要記錄起跑同學的資料,一邊要記錄到達同學的資料,而且
同學們回到終點的次序與起跑的次序並不相同,所以你還要不停地在你的成績冊上查詢學生號。忙亂之
中你往往會張冠李戴。你可能會想出更聰明的辦法:你帶了很多塊秒錶,讓同學們分組互相測驗。恭喜你!你已經掌握了多線
程同步模式!每個拿秒錶的同學都可以獨立呼叫你的同步函式,這樣既不容易出錯,效率也大大提高,只要秒錶足夠
多,同步的效率也能達到甚至超過非同步。可以理解,你現的問題可能是:既然多執行緒同步既快又好,非同步模式還有存在的必要嗎?很遺憾,非同步模式依然非常重要,因為在很多情況下,你拿不出很多秒錶。你需要通訊的對端系統可能
只允許你建立一個SOCKET連線,很多金融、電信行業的大型業務系統都如此要求。現在,你應該已經明白了:CAsyncSocket用於在少量連線時,處理大批量無步驟依賴性的業務。CSocket
用於處理步驟依賴性業務,或在可多連線時配合多執行緒使用。
二、CAsyncSocket非同步機制當你獲得了一個非同步連線後,實際上你掃除了傳送動作與接收動作之間的依賴性。所以你隨時可以發包,
也隨時可能收到包。傳送、接收函式都是非同步非阻塞的,頃刻就能返回,所以收發交錯進行著,你可以
一直工作,保持很高的效率。但是,正因為傳送、接收函式都是非同步非阻塞的,所以僅呼叫它們並不能
保障傳送或接收的完成。例如傳送函式Send,呼叫它可能有4種結果:1、錯誤,Send()==SOCKET_ERROR,GetLastError()!=WSAEWOULDBLOCK,這種情況可能由各種網路問題導
致,你需要馬上決定是放棄本次操作,還是啟用某種對策2、忙,Send()==SOCKET_ERROR,GetLastError()!=WSAEWOULDBLOCK,導致這種情況的原因是,你的傳送