利用CAsyncSocket類實現Socket程式設計

2021-03-31 08:56:57 字數 2716 閱讀 4946

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

客戶端

建立乙個dialog based專案:csockclient。設計一對話方塊,增加id_connect(連線)、id_send(傳送)、id_exit(關閉)按鈕,增加listbox控制項idc_listmsg和edit控制項idc_editmsg,並按下表在classwizard中為ccsockclientdlg類新增變數。

control id type member

idc_editmsg cedit m_msg

idc_listmsg clistbox m_msgs 

在mysock.ccp中新增以下**:

#include "csockclient.h"

#include "csockclientdlg.h" 

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

public:

bool m_bconnected;

uint m_nlength;

char m_szbuffer[4096]; 

在mysock.ccp中過載各函式

control id type member

idc_addr cstring m_addr

idc_port int m_port

在csockclientdlg.ccp中新增**:

#include "addrdlg.h"

protected:

int trycount;

mysock m_clientsocket;

uint m_szport;

public:

char m_szserveradr[256];

雙擊idd_csockclient_dialog對話方塊中的「連線」按鈕,新增以下**:

m_clientsocket.shutdown(2);

m_clientsocket.m_hsocket=invalid_socket;

m_clientsocket.m_bconnected=false;

caddrdlg m_dlg;

m_dlg.m_port=1088;//預設埠1088

if (m_dlg.domodal()==idok && !m_dlg.m_addr.isempty())

新增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);

} 雙擊idd_csockclient_dialog對話方塊中的「傳送」按鈕,新增以下**:

void ccsockclientdlg::onsend()

} 雙擊idd_csockclient_dialog對話方塊中的「關閉」按鈕,新增以下**:

void ccsockclientdlg::onexit()

執行此專案,連線時輸入主機名或ip均可,casyncsocket類會自動處理。

服務端

server端的程式設計與client端的類似,下面主要介紹他的listen及accept函式。建立乙個**ewsocket類,過載casyncsocket類的onreceive、onsend函式,如何進行資訊的顯示和傳送可以參考client程式。本例中採用將收到資訊原封不動發回的方法來實現echo功能,**如下:

**ewsocket::onreceive(int nerrorcode)

// 直接**訊息

**ewsocket::onsend(int nerrorcode)

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

在myserversocket.h中宣告變數

public::

**ewsocket* m_psocket;

void cmyserversocket::onaccept(int nerrorcode)

else

delete psocket;

} 為對話方塊新增乙個「偵聽」按鈕,新增如下**:

在csockserverdlg.ccp中宣告變數

public:

cmyserversocket m_srvrsocket;

void ccsockserverdlg::onlisten()

} if (!m_srvrsocket。listen(1)) }}

casyncsocket類為我們使用socket提供了極大方便。建立socket的wsastartup過程和bind過程被簡化成為create過程,ip位址型別轉換、主機名和ip位址轉換的過程中許多複雜的變數型別都被簡化成字串和整數操作,特別是casyncsocket類的非同步特點,完全可以替代繁瑣的執行緒操作。mfc提供了大量的類庫,我們若能靈活的使用他們,便會大大提高程式設計的效率。

CAsyncSocket程式設計 MFC

許多時候我們實現網路程式設計使用的是winsock api函式,雖然這些函式使用起來也很方便,很靈活,但是vc 的mfc類庫中提供了casyncsocket這樣乙個套接字類,用它來實現socket程式設計會更方便。server端的程式設計與client端的類似,下面主要介紹他的listen及acce...

當CAsyncSocket遇到多執行緒

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

CAsyncSocket物件不能跨執行緒之分析

casyncsocket物件不能跨執行緒之分析 用多執行緒方法設計socket程式時,你會發現在跨執行緒使用casyncsocket及其派生類時,會出現程式崩潰。所謂跨執行緒,是指該物件在乙個執行緒中呼叫create attachhandle attach函式,然後在另外乙個執行緒中呼叫其他成員函式...