第9章 網絡編程_第1頁
第9章 網絡編程_第2頁
第9章 網絡編程_第3頁
第9章 網絡編程_第4頁
第9章 網絡編程_第5頁
已閱讀5頁,還剩93頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第9章 網絡(wnglu)編程共九十八頁9.1 聊天室程序(chngx)9.1.1聊天室應用程序功能(gngnng)介紹服務器應用程序共九十八頁客戶端應用程序共九十八頁9.1.2 程序開發(fā)步驟(bzhu)介紹CStocket程序設計(chn x sh j)基礎使用CStocket類開發(fā)聊天室客戶端應用程序使用CStocket類開發(fā)聊天室服務器端應用程序共九十八頁9.2 CSocket程序設計(chn x sh j)基礎在VC+中,利用WinSock編程有兩種途徑(tjng)通過WinSock API進行編程利用MFC提供的WinSock類編程共九十八頁9.2.1 計算機名、IP地址(dzh)和

2、端口1. IP地址Internet中的每一臺主機都分配有一個唯一的32位二進制地址,該地址稱為IP地址。每個IP地址是由網絡號和主機號兩部分組成的。 IP地址的32位的二進制數,由四個字節(jié)組成,并分成四組,每組一個字節(jié)(8位),各組之間用一個小圓點號“.”分開。如:某計算機的IP地址可表示(biosh)為:1001010.01100011.01100000.10001100。為了便于記憶,通常把每一組二進制數轉換成相應的十進制數;這臺主機的IP地址就是40。(8商都dns主機的地址)共九十八頁IP地址(dzh)的分類IP地址通常分為五類,即A類地址、B類地址、C類地址、D類地址和E類地址。 A

3、類地址用于規(guī)模較大的網絡,主機可以達到16777214個,B類地址適用于中等(zhngdng)規(guī)模的網絡,全世界大約有16000個B類網絡,每個B類網絡最多可以連接65534臺主機。而C類地址用于規(guī)模較小的網絡,最多只能有254個主機 共九十八頁域名(y mn)系統(tǒng)DNS域名系統(tǒng)TCP/IP為人們記憶方便而設計了一種字符型的計算機命名機制,便形成了網絡域名系統(tǒng)(DNS)。 域名系統(tǒng)的結構是一種分層次結構。每個域名是由幾個域組成的,域與域之間用小圓點“.”分開,最末的域叫頂級域,其它域的叫子域 。一般格式為:主機名.商標名(企業(yè)名).單位性質或地區(qū)代碼(di m).國家代碼(di m) 共九十八

4、頁共九十八頁2. 計算機名winntsystem32driversetchosts文件(wnjin) localhost #localhost為計算機名共九十八頁3. 端口通訊(tngxn)進程 = IP地址 + 端口有些為特殊目的端口,如80-http; 25-ftp;其它為自由端口共九十八頁9.2.2 WinSock和MFC通信的基礎是套接口(Socket),一個Socket是通信的一端在這一端上用戶可以找到與其對應的名字一個正在被使用(shyng)的套接口都有它的類型和與其相關的進程共九十八頁流式套接口(ji ku)提供了雙向的、有序的、無重復并且(bngqi)無記錄邊界的數據流服務共九

5、十八頁數據(shj)報套接口支持雙向的數據流,但并不保證(bozhng)是可靠、有序和無重復的一個數據報套接口接收信息的進程有可能發(fā)現信息重復了,或者和發(fā)出時的順序不同它保留了記錄邊界可以用來向許多系統(tǒng)支持的網絡發(fā)送廣播數據包共九十八頁MFC中提供(tgng)了兩個類用于WinSock編程:CAsyncSocket類和CSocket類共九十八頁CAsyncSocket類對Windows Sockets API進行了封裝提供基于異步通信的套接口封裝功能適用于需要充分利用Winsock API的靈活性,并使用回調函數來響應(xingyng)網絡事件的情況共九十八頁CSocket類是CAsyncSo

6、cket類的派生類,該類對WinSock類進行了更多的封裝,提供更多高層次的功能利用CArchive類進行數據傳輸,從而使利用該類進行數據傳輸的過程與MFC的串行化一致該類通過對Windows消息的處理來實現阻塞(zs),從而實現基于CAchive的同步數據傳輸共九十八頁注意(zh y):在編寫網絡程序時,所創(chuàng)建的新類必須聲明自己是CAsyncSocket或CSocket類的子類原因是想捕獲激活的事件有一系列函數可以調用(dioyng),以響應每一個事件,這些函數使用同樣的定義,只是函數名有些差別共九十八頁 函數事件描述OnAccept監(jiān)聽方調用此函數表示對方程序的連接請求正等待被接受OnCl

7、ose表示連接的另一端的應用程序已經關閉它的Socket,或者連接已經丟失,接著,收到此通知的Socket應該關閉OnConnect表示與對方程序的連接已經完成,程序現在可以通過Socket發(fā)送或接收消息OnOutofBanData表示收到外帶數據,外帶數據在一個邏輯上獨立的通道上發(fā)送,用于經濟數據的發(fā)送,不是常規(guī)數據的一部分,Send和Receive方法都用第3個參數,用于外帶數據的發(fā)送和接收OnReceive表示通過Socket連接的數據已經收到,可調用Receive函數接收OnSend表示通過Socket已經準備好發(fā)送數據,連接完成即可調用此函數.通常,程序傳送給Send函數的數據太多,

8、超過了單個數據包中可以發(fā)送的數量,這時也可以調用此函數.這表示,已發(fā)送所有數據,程序可以發(fā)送下一個緩沖數據共九十八頁9.2.3 WinSock的工作(gngzu)原理WinSock的工作方式(fngsh)為服務器-客戶模式有面向連接和無連接兩種通信方式共九十八頁有連接(linji)的通信使用(shyng)的是TCP協議,通過TCP協議可以與指定IP地址的主機建立連接,同時利用建立的連接可以雙向交換數據采用流的方式進行數據傳輸,要求客戶必須指定服務器的地址能保證通過網絡進行數據傳輸的可靠性共九十八頁WinSock進行(jnxng)有連接的通信模型創(chuàng)建(chungjin)套接口:Create()綁

9、定套接口:Bind()偵聽接口:Listen()等待客戶請求:Accept()數據讀/寫:Receive/Send關閉套接口:Close()服務器端創(chuàng)建套接口:Create()連接到服務器:Connect()數據讀/寫:Receive/Send關閉套接口:Close()客戶端建立連接阻塞,等待客戶數據請求/應答數據共九十八頁在有客戶連接請求之前,服務器線程或進程(jnchng)將會阻塞,直到有客戶程序成功地連接到了服務器上后才繼續(xù)往下運行在單線程的應用程序中,服務器線程或進程阻塞就意味著整個應用程序都無法繼續(xù)運行,可以選擇多線程的方式來解決共九十八頁解決阻塞(zs)問題的方案利用產生和響應網絡

10、事件的方式來解決阻塞問題服務器在等待客戶請求時并不進入阻塞狀態(tài),而是直接返回,進入偵聽網絡事件的循環(huán)中當需要讀客戶數據時,同樣也并不陷入(xinr)阻塞狀態(tài),而是直接返回到消息循環(huán)中共九十八頁利用(lyng)WinSock進行無連接的通信使用的是UDP協議,通過UDP協議可以往指定IP地址的主機發(fā)送數據,同時也可以從指定IP地址的主機接收數據發(fā)送和接收方處于相同(xin tn)的地位,沒有主次之分共九十八頁發(fā)送數據int CAsyncSocket:SendTo( cont void * lpBuf, int nBufLen, UINT nHostPort, LPCTSTR lpszHostAd

11、dress = NULL, int nFlag = 0);共九十八頁接收數據int CAsyncSocket:ReceiveFrom( void * lpBuf, int nBufLen, CString & rSocketAddress UINT& rSocketPort, int nFlags = 0);共九十八頁2. 無連接(linji)通訊模型創(chuàng)建(chungjin)套接口:Create()綁定套接口:Bind()接收數據:ReceiveFrom()發(fā)送數據:SendTo()關閉套接口:Close()服務器端創(chuàng)建套接口:Create()發(fā)送數據:SendTo()接收數據:Receive

12、From()關閉套接口:Close()客戶端服務請求阻塞,等待客戶數據服務應答綁定套接口:Bind()共九十八頁利用UDP協議發(fā)送和接收都可以是雙向的,就是說,任何一個主機(zhj)都可以發(fā)送和接收數據UDP協議是無連接的,所以發(fā)送的數據不一定能被接收,接收的順序也有可能與發(fā)送的順序不一致共九十八頁發(fā)送(f sn)方在端口800上向接收方端口900發(fā)送數據的部分子函數/ m_port:800,m_ip=_T(“”)void CMyClientDlg:OnLink()/ TODO:Add extra initialization hereUpdateData(true);m_socketRecv

13、.Creat(m_port,SOCK_DGRAM,m_ip);m_socketRecv.Bind(m_port,m_ip);SetTimer(2,3000,NULL);.共九十八頁void CMyClientDlg:OnTimer(UINT nIDEvent)char szRecv20;int iRecv = m_socketRecv.ReceiveFrom(szRecv,10,m_ip,m_port,0);szRecviRecv=0;m_edit1= szRecv;UpdateData(false);CDialog:OnTimer(nIDEvent);共九十八頁void CMyserverD

14、lg:OnLink()UpdateData(true);m_socketSend.Creat(m_port,SOCK_DGRAM,NULL);m_socketSend.Bind(m_port,m_ip);SetTimer(1,3000,NULL);.共九十八頁void CMyserverDlg:OnTimer(UINT nIDEvent)Static iIndex=0;char szSend20=“1234567890”;sprintf(szSend, “%d”,iIndex+);m_transmit_info = sz;Send;Updatedata(false);int iSend = m

15、_socketSend.SendTo(szSend,10,m_port,m_ip,0);CDialog:OnTimer(nIDEvent);共九十八頁9.3 基于(jy)CSocket的網絡編程面向有連接的流式套接口提供了可靠的、有序的且不重復的連接在進行連接時,服務器端通常在一個眾所周知的端口偵聽,當客戶端發(fā)出連接請求時,服務器被喚醒(hunxng),然后為客戶應用程序提供服務或進行數據傳輸共九十八頁服務器端從CSocket類派生一個(y )新類創(chuàng)建一個CSocket派生類對象調用CSocket:Creat()函數創(chuàng)建一個套接口,并指定一個端口調用CSocket:Listen()函數偵聽端口

16、在CSocket派生類中添加虛函數OnAccept(),用于響應客戶應用程序的連接請求,通過調用CSocket:Accept()函數接受客戶的連接請求,在Receive()函數中進行讀操作通信結束時,調用讀寫套接口的Close()函數關閉各個客戶分配的讀寫套接口共九十八頁客戶端創(chuàng)建一個CSocket類的派生類對象,用于連接和讀寫調用(dioyng)CSocket:Creat()函數創(chuàng)建一個套接口調用CSocket:Connect()函數連接服務器的指定端口調用CSocket:Send()函數發(fā)送數據在CSocket:OnReceive()函數中進行讀操作在結束通信時,調用CSocket:Clo

17、se()函數關閉套接口共九十八頁9.4 聊天室客戶端應用程序9.4.1 創(chuàng)建(chungjin)工程MyWc共九十八頁共九十八頁共九十八頁9.4.2 可視化設計(shj)共九十八頁9.4.3 創(chuàng)建(chungjin)一個新類CWCSock共九十八頁共九十八頁共九十八頁9.4.4 修改(xigi)CWCSocket類(1) 在WCSock.h中定義存儲(cn ch)數據的結構體typedef structchar m_strName255; /客戶名字char m_dbData255; /要發(fā)送的數據或信息BOOL m_bOnline; /客戶是否在線_DATA;共九十八頁(2) 在CWCSoc

18、k類中添加(tin ji)數據成員/ WCSock.hclass CWCSock : public CSocket./ Overridespublic:_DATA m_Dat; .共九十八頁(3) 在WCSock.h中定義自定義消息,以使CWCSock能夠(nnggu)同應用程序主窗口通信#define RE_RECEIVED WM_USER+1共九十八頁(4) 編寫(binxi)OnReceive()函數代碼共九十八頁void CWCSock:OnReceive(int nErrorCode)/TODO:Add your specialized code here and/or call t

19、he base classif (Receive (&m_Dat,sizeof(m_Dat)= = sizeof(m_Dat):PostMessage(:AfxGetApp()-m_pMainWnd-m_hWnd, RE_RECEIVED, (WPARAM)&m_Dat,0);CSocket:OnReceive(nErrorCode);共九十八頁(1) 為CMyWcDlg類添加相應成員(chngyun)變量9.4.5 為編輯(binj)控件引入變量共九十八頁同時(tngsh),用手工方法添加 m_Dat/ MyWcDlg.hclass CMyWcDlg : public CDialog/ Co

20、nstructionpublic:CMyWcDlg(CWnd* pParent = NULL);/ standard constructor_DATA m_Dat;.共九十八頁(1)為CMyWcDlg類添加(tin ji)相應的成員變量LRESULT OnReceive(WPARAM wparam,LPARAM lParam);/Dialog Data/AFX_DATA(CMyWcDlg)Enum IDD = IDD_MYWC_DIALOG;CListBox m_ctlSent;CListBox m_ctlRecvd;int m_nPort;CString m_server_name;CStr

21、ing m_client_name;CString m_send_info共九十八頁(2) 在構造函數中進行(jnxng)初始化/ MyWcDlg.cppCMyWcDlg:CMyWcDlg(CWnd* pParent /*=NULL*/): CDialog(CMyWcDlg:IDD, pParent)memset(&m_Dat,0,sizeof(m_Dat);/AFX_DATA_INIT(CMyWcDlg)m_client_name = _T(localhost);m_send_info = _T();m_server_name = _T(localhost);m_nPort = 800;/A

22、FX_DATA_INIT/ Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME);共九十八頁(3) 添加(tin ji)數據交換代碼/ MyWcDlg.cppvoid CMyWcDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CMyWcDlg)DDX_Control(pDX, IDC_SENT_INFO, m_

23、ctlSent);DDX_Control(pDX, IDC_RECEIVED_INFO, m_ctlRecvd);DDX_Text(pDX, IDC_CLIENT_NAME, m_client_name);DDX_Text(pDX, IDC_SEND_INFO, m_send_info);DDX_Text(pDX, IDC_SERVER_NAME, m_server_name);DDX_Text(pDX, IDC_SERVER_PORT, m_nPort);/AFX_DATA_MAP系統(tǒng)自動(zdng)完成共九十八頁9.4.6 建立(jinl)CMyWcDlg類與CWCSock類的關聯在CMy

24、WcDlg類定義前添加(tin ji)如下語句:/ MyWcDlg.h#include WCSock.h在CMyWcDlg類定義中添加如下語句:/ MyWcDlg.hclass CMyWcDlg : public CDialog/ Constructionpublic:CWCSock sockClient;共九十八頁9.4.7 編寫(binxi)程序代碼1. 添加(tin ji)消息響應函數共九十八頁2. 編寫(binxi)程序代碼void CMyWcDlg:OnConnect() /更新關聯變量,如服務器名、端口號UpdateData(true);/創(chuàng)建(chungjin)套接口if(!so

25、ckClient.Create()AfxMessageBox(Create WC Socket failed);PostQuitMessage(0);/與服務器連接if(!sockClient.Connect(m_server_name,m_nPort)MessageBox(連接失敗!);return;m_Dat.m_bOnline=true;共九十八頁void CMyWcDlg:OnSend() /更新關聯變量,如要發(fā)送(f sn)的消息UpdateData(true);m_Dat.m_bOnline=true;memset(m_Dat.m_dbData,0,255);memcpy(m_Da

26、t.m_dbData,m_send_info,m_send_info.GetLength();strcpy(m_Dat.m_strName,m_client_name);/發(fā)送的消息int iSent=sockClient.Send(&m_Dat,sizeof(m_Dat);/如發(fā)送成功,將其發(fā)送的消息添加并顯示在列表框if(iSent!=SOCKET_ERROR)m_ctlSent.AddString(m_send_info);UpdateData(false); /顯示共九十八頁void CMyWcDlg:OnClose() m_Dat.m_bOnline=false;strcpy(m_D

27、at.m_dbData,886);sockClient.Send(&m_Dat,sizeof(m_Dat);/斷開(dun ki)與服務器的連接sockClient.Close();共九十八頁9.4.8 處理(chl)自定義消息添加消息(xio xi)映射宏:/ MyWcDlg.cppBEGIN_MESSAGE_MAP(CMyWcDlg, CDialog)/AFX_MSG_MAP(CMyWcDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_SEND, OnSend)ON_BN_CLICKED(ID

28、C_CONNECT, OnConnect)ON_BN_CLICKED(IDC_CLOSE, OnClose)ON_MESSAGE(RE_RECEIVED,OnmyReceive)/AFX_MSG_MAPEND_MESSAGE_MAP()共九十八頁聲明(shngmng)函數OnmyReceive():/ MyWcDlg.h class CMyWcDlg : public CDialog.LRESULT OnmyReceive(WPARAM wparam, LPARAM lParam);.共九十八頁添加(tin ji)函數OnmyReceive()的函數體:LRESULT CMyWcDlg:Onm

29、yReceive(WPARAM wparam,LPARAM lParam)_DATA *dat;dat=new _DATA;memcpy(dat,(_DATA*)wparam,sizeof(_DATA);CString str=dat-m_strName;str+=:;str+=dat-m_dbData;m_ctlRecvd.AddString(str);UpdateData(false);delete dat;return 1;共九十八頁9.4.9 處理(chl)控件的更新OnClose()和OnInitDialog()最后(zuhu)加上GetDlgItem(IDC_CONNECT)-En

30、ableWindow(true);GetDlgItem(IDC_SEND)-EnableWindow(false);GetDlgItem(IDC_CLOSE)-EnableWindow(false);GetDlgItem(IDC_SERVER_PORT)-EnableWindow(true);GetDlgItem(IDC_CLIENT_NAME)-EnableWindow(true);GetDlgItem(IDC_SERVER_NAME)-EnableWindow(true);共九十八頁OnConnect()最后(zuhu)加上GetDlgItem(IDC_CONNECT)-EnableWin

31、dow(false);GetDlgItem(IDC_SEND)-EnableWindow(true);GetDlgItem(IDC_CLOSE)-EnableWindow(true);GetDlgItem(IDC_SERVER_PORT)-EnableWindow(false);GetDlgItem(IDC_CLIENT_NAME)-EnableWindow(false);GetDlgItem(IDC_SERVER_NAME)-EnableWindow(false);共九十八頁9.4.10 編譯(biny)、連接運行共九十八頁9.4.11 ClistBox類函數名說明ModifyStyle改變

32、列表框的風格AddString向列表框加入項InsertString在指定位置加入一個字符串項SetTopIndex設置某點位于列表框的頂部DeleteItem刪除某項GetCount獲得總項數GetCurSel獲得所選項序號GetText獲得指定項文本共九十八頁9.5 聊天室服務器端應用程序9.5.1 創(chuàng)建(chungjin)工程MyWs共九十八頁共九十八頁共九十八頁9.5.2 可視化設計(shj)共九十八頁9.5.3 創(chuàng)建(chungjin)一個偵聽類CLSock共九十八頁9.5.4 增加(zngji)一個讀/寫類CRWSock注意(zh y)和CLSock使用同一對文件共九十八頁9.5.

33、5 為編輯框控件引入變量(binling)共九十八頁9.5.6 修改(xigi)CRWSock和CLSock類1. 添加結構體成員(chngyun)變量typedef structchar m_strName255; /客戶名字char m_dbData255; /要發(fā)送的數據或信息BOOL m_bOnline; /客戶是否在線_DATA;和客戶端完全相同共九十八頁在CRWSock類中添加數據(shj)成員/ LSock.hclass CRWSock : public CSocket/ Attributespublic:_DATA m_Dat;.共九十八頁2. 添加CMyWsDlg類指針(zh

34、zhn)成員變量,修改CMyWsDlg的構造函數/ LSock.hclass CMyWsDlg; /放到文件(wnjin)最前面.class CRWSock : public CSocket/ Attributespublic:_DATA m_Dat;/ Operationspublic:CRWSock(CMyWsDlg *p);virtual CRWSock();.private:CMyWsDlg *m_p;共九十八頁/ LSock.cppCRWSock:CRWSock(CMyWsDlg *p)m_p=p;共九十八頁3. 在CLSock類,添加CMyWsDlg類指針(zhzhn)成員變量,修

35、改CLSock的構造函數/ LSock.hclass CLSock : public CSocket/ Attributespublic:/ Operationspublic:CLSock(CMyWsDlg *p);virtual CLSock();.protected:private:CMyWsDlg *m_p;共九十八頁/ LSock.cpp CLSock:CLSock(CMyWsDlg *p)m_p=p;在LSock.cpp中添加(tin ji)頭文件: #include MyWsDlg.h共九十八頁9.5.7 修改(xigi)CMyWsDlg類1. 添加(tin ji)頭文件/ MyW

36、sDlg.h #include LSock.h共九十八頁2. 添加成員變量(binling)和成員函數/ MyWsDlg.hclass CMyWsDlg : public CDialogpublic:CMyWsDlg(CWnd* pParent = NULL);/ standard constructorvoid AcceptClient();void ReadMessage(CRWSock *sock);_DATA m_Dat;.DECLARE_MESSAGE_MAP()private:void SendSocketMessage(CRWSock *socket,_DATA *buffer)

37、;/添加一個CPtrList類的對象,用于管理各個客戶(k h)的套接口CPtrList m_list;CRWSock *m_clientSocket;CLSock *m_listenSocket;共九十八頁3. 初始化成員(chngyun)變量/ MyWsDlg.cppCMyWsDlg:CMyWsDlg(CWnd* pParent /*=NULL*/): CDialog(CMyWsDlg:IDD, pParent)m_clientSocket=NULL;m_listenSocket=NULL;/AFX_DATA_INIT(CMyWsDlg)m_server_port = 800;/AFX_D

38、ATA_INIT/ Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME);共九十八頁4. 在MyWsDlg.cpp文件中添加實現(shxin)函數體/ MyWsDlg.cppvoid CMyWsDlg:AcceptClient()m_clientSocket=new CRWSock(this);if(!m_listenSocket-Accept(*m_clientSocket)AfxMessageBox(請求(qngqi

39、)連接失敗);delete m_clientSocket;m_clientSocket=NULL;return;m_list.AddTail(m_clientSocket);共九十八頁9.5.8 處理(chl)接收客戶的信息1. 添加虛擬(xn)函數OnReceive()此處應該為CRWSock,但程序編寫時顯示不出來CRWSock,所以在LSock.h和LSock.cpp中對應位置進行了手動修改共九十八頁2. 編寫(binxi)程序代碼/ LSock.cppvoid CLSock:OnReceive(int nErrorCode) m_p-ReadMessage(this);CSocket:

40、OnReceive(nErrorCode);共九十八頁void CMyWsDlg:ReadMessage(CRWSock *sock)int len=sock-Receive(&m_Dat,sizeof(m_Dat);if(len=sizeof(m_Dat)_DATA *dat=&m_Dat;CString str=收到客戶機(;str+=dat-m_strName;str+=)的消息:;str+=dat-m_dbData;m_ctlRecvd.AddString(str);if(m_Dat.m_bOnline)SendSocketMessage(sock,&m_Dat);else /如果客戶

41、不在線,則關閉(gunb)套接口,并從鏈表中刪除sock-Close();POSITION pos;pos=m_list.Find(sock);m_list.RemoveAt(pos);if(sock!=NULL) delete sock;共九十八頁void CMyWsDlg:SendSocketMessage(CRWSock *socket,_DATA *buffer)POSITION pos=m_list.GetHeadPosition();while(pos!=NULL)CRWSock *client=(CRWSock*)m_list.GetNext(pos);if(client=soc

42、ket) continue; /不發(fā)給(f i)自身client-Send(&m_Dat,sizeof(m_Dat);共九十八頁9.5.9 處理客戶的連接(linji)請求1. 在CMyWsDlg類中,添加一個CPtrList類的對象,用于管理各個(gg)客戶的套接口/ MyWsDlg.hclass CMyWsDlg : public CDialogpublic:CMyWsDlg(CWnd* pParent = NULL);/ standard constructorvoid AcceptClient();void ReadMessage(CRWSock *sock);_DATA m_Dat;

43、/CPtrList m_list;.前面已定義過共九十八頁2. 在CLSock類中添加虛擬函數(hnsh)OnAccept(),用于處理客戶的連接請求共九十八頁void CLSock:OnAccept(int nErrorCode) ASSERT(m_p);m_p-AcceptClient();CSocket:OnAccept(nErrorCode);共九十八頁/ MyWsDlg.cppvoid CMyWsDlg:AcceptClient()m_clientSocket=new CRWSock(this);if(!m_listenSocket-Accept(*m_clientSocket)Af

44、xMessageBox(請求(qngqi)連接失敗);delete m_clientSocket;m_clientSocket=NULL;return;m_list.AddTail(m_clientSocket);共九十八頁9.5.10 為啟動,關閉(gunb)按鈕的BN_CLICKED事件編寫代碼1. 添加(tin ji)消息響應函數共九十八頁2. 編寫(binxi)程序代碼void CMyWsDlg:OnClose() POSITION pos=m_list.GetHeadPosition();while(pos!=NULL)CRWSock *client=(CRWSock*)m_list.GetNext(pos);delete client;if(m_listenSocket!=NULL)m_listenSocket-Close();delete m_listenSocket;共九十八頁void CMyWsDlg:OnStart(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論