锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
闃呰鍏ㄦ枃
]]>
* All rights reserved. *
* *
* This software is provided ``AS IS'' and any express or implied *
* warranties, including, but not limited to, the implied warranties of *
闃呰鍏ㄦ枃
]]>
聽聽聽聽 杞歡鐧誨綍鎴愬姛欏甸潰錛?img src="http://img.poco.cn/mypoco/myphoto/20060805/2486345220060805135811072.jpg" />
]]>
]]>
Socket緙栫▼鍦ㄥぇ澶氭暟鐨勭紪紼嬭璦涓兘鏄竴浠舵瘮杈冩湁瓚g殑浜嬫儏銆傚畠鏄瘮杈冨父鐢ㄧ殑緙栧啓閫氳繃緗戠粶閫氫俊鐨勬湇鍔″櫒鍜屽鎴風鏂規硶銆傚湪windows騫沖彴Socket閫氫俊澶у鏄熀浜嶮S Winsock璁捐鐨勩俉indows鏀寔鍩轟簬TCP鍜孶DP鐨剆ocket閫氫俊銆俉indows APIs鍦╯ocket緙栫▼涓槸闈炲父鏈夌敤鐨勶紝浣嗘槸鏈変簺浜哄彂鐜板湪鐢ㄥ畠浠伐浣滅殑鏃跺欐湁鍥伴毦銆?br />鎵浠ュ湪榪欓噷鎴戜粙緇嶄竴縐嶆渶綆鍗曠敤MFC socket綾昏繘琛宻ocket緙栫▼鐨勬柟娉曘傝繖涓嶄粎鍙互浣夸綘鐨勫伐浣滃彉寰楃畝鍗曡屼笖鑳藉噺灝戜綘鍦ㄧ綉緇滅▼搴忎笂鐨勫紑鍙戞椂闂淬備綘鍙互瀹氬埗涓涓猻ocket綾伙紝鐒跺悗浣犲彲浠ュ湪浣犵殑鍏朵粬鐨勭綉緇滃簲鐢ㄧ▼搴忎腑閲嶇敤銆?br />鍦╯ocket緙栫▼涓紝MFC鎻愪緵浜嗕袱涓熀鏈殑綾伙紝鍒嗗埆鏄疌AsyncSocket鍜孋socket銆侰socket鏄粠CAsyncSocket緇ф壙鏉ョ殑銆傛垜浠彲浠ュ緩绔嬪畾鍒剁殑socket綾伙紝涔熸槸浠嶤asyncSocket緇ф壙鑰屾潵鐨勶紝褰撶劧涔熸槸涓轟簡鎴戜滑紼嬪簭鐗規畩鐨勯渶瑕併?br />鍒濆鍖杝ocket
棣栧厛闇瑕佽皟鐢ˋfxSocketInit()鍑芥暟鏉ュ垵濮嬪寲鎴戜滑鐨剆ocket鐜銆?br />涓轟簡鍒濆鍖杝ockets錛屾垜浠渶瑕佽皟鐢ˋfxSocketInit()鍑芥暟銆傚畠閫氬父鏄湪MFC涓殑InitInstance()鍑芥暟涓璋冪敤鐨勩傚鏋滄垜浠敤紼嬪簭鍚戝鏉ュ垱寤簊ocket紼嬪簭鐨勮瘽錛屾煡鐪?#8220;use Windows Sockets”榪欎釜閫夐」錛岀劧鍚庨変腑瀹冦傚畠灝嗕細鑷姩鐨勪負鎴戜滑鍒涘緩榪欎釜姝ラ浜嗐傦紙濡傛灉鎴戜滑娌℃湁閫変腑榪欎釜閫夐」鐨勮瘽錛屾垜浠篃鍙互鎵嬪姩娣誨姞榪欎簺浠g爜鐨勩傦級榪欎釜鍑芥暟鐨勮繑鍥炲兼樉紺鴻繖涓嚱鏁扮殑璋冪敤鎴愬姛鎴栧け璐ャ?br />BOOL CServerApp::InitInstance()
{....
if( AfxSocketInit() == FALSE)
{
AfxMessageBox("Sockets Could Not Be Initialized");
return FALSE;
}
...
}
鍒涘緩Server Sockets
涓轟簡鍒涘緩涓涓猄erver Socket錛屾垜浠渶瑕佸0鏄庝竴涓狢AyncSocket鐨勫彉閲忔垨鑰呮垜浠嚜宸卞畾鍒剁殑涓涓粠AyncSocket鎴栨槸Cscket緇ф壙鏉ョ殑綾葷殑綾誨瀷鐨勫彉閲忋傜劧鍚庤皟鐢–reate()鍑芥暟錛屽悓鏃舵寚瀹氱洃鍚殑绔彛銆傝繖涓嚱鏁扮殑榪斿洖鍊兼樉紺鴻繖涓嚱鏁扮殑璋冪敤鎴愬姛鎴栧け璐ャ?br />UpdateData(TRUE);
m_sListener.Create(m_port);
if(m_sListener.Listen()==FALSE)
{
AfxMessageBox("Unable to Listen on that port,please try another port");
m_sListener.Close();
return;
}
鍒涘緩Client Sockets
涓轟簡鍒涘緩Client socket綾伙紝鎴戜滑闇瑕佸0鏄庝竴涓狢AyncSocket鐨勫彉閲忔垨鑰呮垜浠嚜宸卞畾鍒剁殑涓涓粠AyncSocket鎴栨槸Cscket緇ф壙鏉ョ殑綾葷殑綾誨瀷鐨勫彉閲忋傜劧鍚庤皟鐢–reate()鍑芥暟錛屽悓鏃舵寚瀹氱洃鍚殑绔彛銆傝繖涓嚱鏁扮殑榪斿洖鍊兼樉紺鴻繖涓嚱鏁扮殑璋冪敤鎴愬姛鎴栧け璐ャ?br />m_sConnected.Create();
m_sConnected.Connect("server ip",port);
鐩戝惉瀹㈡埛绔殑榪炴帴
鍒涘緩浜唖erver socket浠ュ悗錛屾垜浠榪涜鐩戝惉銆傝皟鐢↙isten()鍑芥暟銆傝繖涓嚱鏁扮殑榪斿洖鍊兼樉紺鴻繖涓嚱鏁扮殑璋冪敤鎴愬姛鎴栧け璐ャ?br />if( m_sListener.Listen()== FALSE)
{
AfxMessageBox("Unable to Listen on that port,please try another port");
m_sListener.Close();
return;
}
鎺ュ彈榪炴帴
榪炴帴璇鋒眰瑕佽鎺ュ彈accept錛屾槸鐢ㄥ彟澶栫殑socket錛屼笉鏄鍦ㄧ洃鍚殑socket銆傝鍙傜湅浠g爜銆?br />void CXXXDlg::OnAccept()
{
CString strIP;
UINT port;
if(m_sListener.Accept(m_sConnected))
{
m_sConnected.GetSockName(strIP,port); //搴旇鏄疓etPeerName錛岃幏鍙栧鏂圭殑IP鍜宲ort
m_status="Client Connected,IP :"+ strIP;
m_sConnected.Send("Connected To Server",strlen("Connected To Server"));
UpdateData(FALSE);
}
else
{
AfxMessageBox("Cannoot Accept Connection");
}
}
鍙戦佹暟鎹?/strong>
鏁版嵁鏀懼湪涓涓猙uffer涓垨鏄粨鏋勪綋涓紝璋冪敤send()鍑芥暟鍙戦併?br />m_sConnected.Send(pBuf,iLen);
鎺ュ彈鏁版嵁
璋冪敤receive()鎺ュ彈鏁版嵁銆?br />void CXXXrDlg::OnReceive()
{
char *pBuf =new char [1025];
CString strData;
int iLen;
iLen=m_sConnected.Receive(pBuf,1024);
if(iLen == SOCKET_ERROR)
{
AfxMessageBox("Could not Recieve");
}
else
{
pBuf[iLen]=NULL;
strData=pBuf;
m_recieveddata.Insert(m_recieveddata.GetLength(),strData);
//display in server
UpdateData(FALSE);
m_sConnected.Send(pBuf,iLen); //send the data back to the Client
delete pBuf;
}
}
鍏抽棴榪炴帴
m_sConnected.ShutDown(0); 鍋滄鍙戦佹暟鎹?br />m_sConnected.ShutDown(1); 鍋滄鎺ュ彈鏁版嵁
m_sConnected.ShutDown(2); 鍋滄鍙戦佹帴鍙楁暟鎹?br />m_sConnected.Close();
緙栧啓鑷繁鐨剆ocket綾?br />鍦╟lass view涓夋嫨娣誨姞涓涓柊綾伙紝璁劇疆瀹冪殑鍩虹被涓篊AsyncSocket錛屽湪綾誨悜瀵肩殑甯姪涓嬫坊鍔犲涓嬬殑涓浜涘嚱鏁般?br />class MySocket : public CAsyncSocket
{ // Attributes
public:
// Operations
public:
MySocket();
virtual ~MySocket();
// Overrides
public:
void SetParentDlg(CDialog *pDlg);// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(MySocket)
public:
virtual void OnAccept(int nErrorCode);
virtual void OnClose(int nErrorCode);
virtual void OnConnect(int nErrorCode);
virtual void OnOutOfBandData(int nErrorCode);
virtual void OnReceive(int nErrorCode);
virtual void OnSend(int nErrorCode);
//}}AFX_VIRTUAL // Generated message map functions
//{{AFX_MSG(MySocket)
// NOTE - the ClassWizard will add and remove member functions here. //}}AFX_MSG
protected:
private:
CDialog * m_pDlg;
};
璁劇疆“Parent Dialog”
璋冪敤榪欎釜socket綾葷殑SetParentDlg鍑芥暟錛屼繚璇佸綋socket浜嬩歡鍙戠敓鐨勬椂鍊欒繖涓獥浣撹兘鎺ユ敹鍒般?br />m_sListener.SetParentDlg(this);
m_sConnected.SetParentDlg(this);
寤虹珛Socket 浜嬩歡鍜岀獥浣撴垚鍛樺嚱鏁頒箣闂寸殑鑱旂郴
鍦ㄨ繖涓獥浣撶被涓坊鍔犱竴浜涘嚱鏁幫紝姣斿void OnReceive(); void OnClose(); void OnAccept(); void OnConnect()絳夛紝瀹冧滑浼氬湪鎴戜滑緙栧啓鐨勭殑socket綾諱腑璋冪敤鍒般?br />void MySocket::OnAccept(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
if(nErrorCode==0)
{
((CServerDlg*)m_pDlg)->OnAccept();
}
CAsyncSocket::OnAccept(nErrorCode);
}
榪欓噷鍙啓浜嗕竴涓狾nAccept錛堬級鍑芥暟錛屽叾浠栫殑鍑犱釜涓篃鏈夌被浼肩殑璋冪敤銆傝緇嗙殑璇峰弬鑰冧唬鐮併?br />
email: ghs_linux@163.com
嬈㈣繋浜ゆ祦鍝?錛氾級