CAsyncSocket程式設計 MFC

2022-03-11 09:43:30 字數 2651 閱讀 6482

許多時候我們實現網路程式設計使用的是winsock api函式,雖然這些函式使用起來也很方便,很靈活,但是vc++的mfc類庫中提供了casyncsocket這樣乙個套接字類,用它來實現socket程式設計會更方便。

server端的程式設計與client端的類似,下面主要介紹他的listen及accept函式

1. 建立乙個cnewsocket類,過載casyncsocket類的onreceive、onsend函式,

如何進行資訊的顯示和傳送可以參考client程式。本例中採用將收到資訊原封不動

發回的方法來實現echo功能,**如下

cnewsocket::onreceive(int

nerrorcode)cnewsocket::onsend(int nerrorcode)

2. 建立乙個cmyserversocket類,過載casyncsocket類的onaccept函式**如下

void cmyserversocket::onaccept(int

nerrorcode)

else

delete psocket;}

在myserversocket.h中宣告變數public::cnewsocket* m_psocket;

3. 對話方塊新增乙個偵聽按鈕,新增如下**

void ccsockserverdlg::onlisten() }

//「偵聽」成功,等待連線請求if (!m_srvrsocket。listen(1)) }}

在csockserverdlg.ccp中宣告變數public: cmyserversocket m_srvrsocket;

4. 目前程式只能實現echo功能,將資訊原封不動的**,若能將accept中由

cnewsocket* psocket = new cnewsocket();

得到的socket指標存入乙個clist或乙個陣列中,便像client端那樣,對所有的連線進行讀寫控制。

1. 建立專案csockclient

2. 設計對話方塊

去掉ok和cancle兩個按鈕,增加id_connect(連線)、id_send(傳送)、id_exit(關閉)按鈕,新增listbox控制項idc_listmsg和edit控制項idc_editmsg,並按下表為為控制項新增變數。

變數idc_editmsg 

cedit 

m_msgidc_listmsg

clistbox

m_msgs

3. casyncsocket類用docallback函式處理mfc訊息,當乙個網路事件發生時,docallback函式按網路事件型別fd_read、fd_write、fd_accept、fd_connect分別呼叫onreceive、onsend、onaccept、onconnect函式。由於mfc把這些函式定義為虛函式,所以要生成乙個新的c++類,以過載這些函式。做法如下:

以public方式繼承casyncsocket類,生成新類mysock類,為mysock類新增虛函式onreceive、onconnect、onsend

4. 在mysock.h中新增以下**:

1

public:2

//是否連線

3bool m_bconnected;4//

訊息長度

5uint m_nlength;6//

訊息緩衝區

7char m_szbuffer[512];

5. 在mysock.cpp中過載各種函式

onreceive、onconnect、onsend

6. 雙擊idd_csockclient_dialog對話方塊中的連線按鈕,新增以下**

1

ccsockclientdlg::onconnect() }

7. 新增windows訊息wm_timer響應函式

ontimer void

ccsockclientdlg::ontimer(uint nidevent) }

m_clientsocket.connect(m_szserveradr,m_szport);

trycount++;

if (trycount >=10 ||m_clientsocket.m_bconnected)

cdialog::ontimer(nidevent);}

8. 雙擊idd_csockclient_dialog對話方塊中的傳送按鈕,新增以下**

void

ccsockclientdlg::onsend() }

9. 雙擊idd_csockclient_dialog對話方塊中的關閉按鈕,新增以下**

ccsockclientdlg::onexit()

casyncsocket類為我們使用socket提供了極大方便。建立socket的wsastartup過程和bind過程被簡化成為create過程,

ip位址型別轉換、主機名和ip位址轉換的過程中許多複雜的變數型別都被簡化成字串和整數操作,特別是casyncsocket

類的非同步特點,完全可以替代繁瑣的執行緒操作。mfc提供了大量的類庫,我們若能靈活的使用他們,便會大大提高程式設計的效

此文為**,自己還沒有實際的實驗過,所以還沒有什麼疑問,

利用CAsyncSocket類實現Socket程式設計

隨著計算機網路化的深入,計算機網路程式設計在程式設計的過程中變得日益重要。許多文章都曾經介紹過用vc 進行socket程式設計的方法。但由於都是直接利用動態連線庫wsock32.dll進行操作,實現比較繁瑣。其實,vc 的mfc類庫中提供了casyncsocket這樣乙個套接字類,用它來實現sock...

當CAsyncSocket遇到多執行緒

用多執行緒方法設計socket程式時,你會發現在跨執行緒使用casyncsocket及其派生類時,會出現程式崩潰。所謂跨執行緒,是指該物件在乙個執行緒中呼叫create attachhandle attach函式,然後在另外乙個執行緒中呼叫其他成員函式。下面的例子就是乙個典型的導致崩潰的過程 cas...

matlab 程式設計 m檔案

功能 命令列簡單疊加,matlab按照順序執行,解決使用者在命令視窗執行許多命令,避免使用者做許多重複性工作。注意 變數為全域性變數 功能 實現計算中引數傳遞和函式呼叫。注意 1 變數為區域性變數 2 檔名 與 函式名 一一對應。3 函式的輸入引數與輸出引數 a 函式有返回引數和輸入引數。例如 傳給...