扔掉Socket實現網路程式設計

2021-04-13 06:23:21 字數 3087 閱讀 2505

隨著計算機網路化的深入,計算機網路程式設計在程式設計的過程中變得日益重要。許多文章都曾經介紹過用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 ...