隨著計算機網路化的深入,計算機網路程式設計在程式設計的過程中變得日益重要。許多文章都曾經介紹過用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中過載各函式
mysock::mysock()
mysock::~mysock()
void mysock::onreceive(int nerrorcode)
void mysock::onsend(int nerrorcode)
void mysock::onconnect(int nerrorcode)
//提請乙個「讀」的網路事件,準備接收
casyncsocket::onconnect(nerrorcode); }
建一對話方塊idd_addr,用來輸入ip位址和port;增加兩個edit控制項:idc_addr、idc_port按下錶在classwizard中為caddrdlg類新增變數。
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函式。建立乙個cnewsocket類,過載casyncsocket類的onreceive、onsend函式,如何進行資訊的顯示和傳送可以參考client程式。本例中採用將收到資訊原封不動發回的方法來實現echo功能,**如下:
cnewsocket::onreceive(int nerrorcode)
// 直接**訊息
cnewsocket::onsend(int nerrorcode)
建立乙個cmyserversocket類,過載casyncsocket類的onaccept函式**如下:
在myserversocket.h中宣告變數
public::
cnewsocket* 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提供了大量的類庫,我們若能靈活的使用他們,便會大大提高程式設計的效率。
VC下socket網路程式設計實現
sockets 套接字 程式設計有三種,流式套接字 sock stream 資料報套接字 sock dgram 原始套接字 sock raw 基於tcp的socket程式設計是採用的流式套接字。在這個程式中,將兩個工程新增到乙個工作區。要鏈結乙個ws2 32.lib的庫檔案。伺服器端程式設計的步驟 ...
網路程式設計 Socket程式設計
一 網路部分 1.ip 2.埠號 在網路協議中使用埠號識別主機上不同的程序,不同的埠對應於不同的服務 應用程式 3.協議 tcp二 socket部門socket通訊基本流程圖 根據socket通訊基本流程圖,總結通訊的基本步驟 伺服器端 第一步 建立乙個用於監聽連線的socket對像 第二步 用指定...
socket網路程式設計
首先認識乙個表示主機資訊的結構體 struct hostent h addrtype 這是表示主機所使用的位址型別的定義,在c語言winsock2.h標頭檔案中以 af 開頭的巨集定義就是它的值。如果使用的是ipv4,則值為 af inet 如果是ipv6,值為 af inet4 h length ...