隨著計算機網路化的深入,計算機網路程式設計在程式設計的過程中變得日益重要。許多文章都曾經介紹過用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函式,然後在另外乙個執行緒中呼叫其他成員函式...