版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、基于局域網(wǎng)聊天程序設(shè)計(jì) 摘 要: 本論文討論了 Windows 環(huán)境下局域網(wǎng)聊天程序的設(shè)計(jì)思路和設(shè)計(jì) 方法。其中網(wǎng)絡(luò)通信部分采用流行的 TCP/IP 協(xié)議。程序采用典型的 C/S( 服務(wù) 器 /客戶端 ) 構(gòu)架。用 socket 編程設(shè)計(jì)網(wǎng)絡(luò)通訊。界面設(shè)計(jì)部分采用 Windows MFC 框架。數(shù)據(jù)庫(kù)采用微軟 SQL Server 。本文最終設(shè)計(jì)了一個(gè)簡(jiǎn)易版本的聊 天軟件,包括登陸、退出、添加好友、消息收 /發(fā)等功能。 關(guān)鍵詞:Sockets API , C/S 構(gòu)架,SQL Server。 Realization of a kind of LAN chat tool Abstract: Th
2、is article discusses how to design and develop a LAN chatting program in Windows environment. The network communication part depends on the popular TCP/IP protocol. Software is based on C/S architecture. Network communication is developed with Socket. UI is designed with Windows MFC frame. Database
3、is designed with SQL server. The articledescribesa concise chart software version, with the function of logging in/out, adding friend to list, sending/receiving message and so on. Key words: Sockets API ,C/S architecture,SQL Server 論文目錄 局域網(wǎng)聊天程序的設(shè)計(jì) 錯(cuò)誤!未定義書(shū)簽。 第一章、概述 3 第二章、WINDOWSOCKETS絡(luò)編程的研究錯(cuò)誤!未定義書(shū)簽。
4、2.1 TCP/IP 體系結(jié)構(gòu) 5 2.2.1 TCP/IP 簡(jiǎn)介 5 2.2.2TCP/IP 的特點(diǎn) 5 2.2 基本套接字 5 2.3 客戶機(jī) / 服務(wù)器模式 7 2.4 WINDOWS SOCKET程序設(shè)計(jì) 8 241 WINDOWS SOCKETS AP簡(jiǎn)介 8 2.4.2WINDOWS SOCKET機(jī)制 9 第三章、網(wǎng)絡(luò)通信模塊分析 錯(cuò)誤!未定義書(shū)簽。 3.1 網(wǎng)絡(luò)通信程序設(shè)計(jì)過(guò)程 11 3.2 網(wǎng)絡(luò)通信程序設(shè)計(jì)核心 13 3.2.1 通信設(shè)計(jì)代碼分析 13 3.2.2 數(shù)據(jù)傳輸代碼分析 17 3.2.3 出錯(cuò)處理 19 第四章、界面模塊分析 20 4.1 服務(wù)器端界面模塊分析 20
5、 4.2 客戶端界面模塊分析 21 4.2.1 用戶登陸界面分析 21 4.2.2 用戶注冊(cè)界面分析 22 4.2.3 在線用戶列表界面分析 錯(cuò)誤!未定義書(shū)簽。 4.2.4 用戶聊天界面分析 錯(cuò)誤!未定義書(shū)簽。 第五章、數(shù)據(jù)庫(kù)模塊分析 錯(cuò)誤!未定義書(shū)簽。 5.1 數(shù)據(jù)庫(kù)的選擇 27 5.2 數(shù)據(jù)庫(kù)訪問(wèn)方法 錯(cuò)誤!未定義書(shū)簽。 5.3 ADO 數(shù)據(jù)庫(kù)編程 錯(cuò)誤!未定義書(shū)簽。 5.3.1 ADO與 ADO接口簡(jiǎn)介錯(cuò)誤!未定義書(shū)簽。 532使用ADC操作SQL代碼分析錯(cuò)誤!未定義書(shū)簽。 第六章、總結(jié) 33 6.1 體會(huì)和感想 33 6.2 總結(jié) 33 第七章、參考書(shū)目 錯(cuò)誤!未定義書(shū)簽。 第一章 概
6、述 即時(shí)通訊軟件的出現(xiàn)正在逐漸改變?nèi)藗兊臏贤ㄅc交際方式。無(wú)論近在咫 尺,還是遠(yuǎn)隔重洋,也只是在鍵盤(pán)和鼠標(biāo)之間就可以解決問(wèn)題。即時(shí)通訊服務(wù) 非常適合企業(yè)內(nèi)部或企業(yè)和客戶之間的交流。而且將即時(shí)通訊服務(wù)和手機(jī)移動(dòng) 等服務(wù)結(jié)合,將更大地提高工作效率。網(wǎng)絡(luò)聊天程序 . 越來(lái)越影響著我們的網(wǎng)絡(luò) 生活。 習(xí)慣了通過(guò)類似ICQ、QQ MSN之類的程序和天南海北的朋友聊天、發(fā)信 息,不過(guò)所有聊天程序都需要 Internet 的支持,而無(wú)法在局域網(wǎng)內(nèi)部“大顯身 手”,那么你是否想到過(guò)要讓單位內(nèi)部的員工,寢室周圍的同學(xué),不用上 Internet 就可以輕松體驗(yàn)到內(nèi)網(wǎng)聊天的快樂(lè)呢?有了這種想法,開(kāi)發(fā)局域網(wǎng)聊 天程序就
7、有了必要性,讓單位員工或?qū)嬍彝瑢W(xué)不出內(nèi)網(wǎng)就能自由聊天! 本文主要研究的是一個(gè)具有高度實(shí)用性的聊天程序軟件的設(shè)計(jì)原理,思路 和過(guò)程。通過(guò)該網(wǎng)絡(luò)程序的編制和實(shí)踐,對(duì)自己所學(xué)習(xí)的知識(shí)進(jìn)行一次綜合和 提高,有更深層次的理解和掌握,在這過(guò)程中激發(fā)自己學(xué)習(xí)的潛力,提高軟件 開(kāi)發(fā)的能力,加深對(duì)網(wǎng)絡(luò)協(xié)議和 windows 環(huán)境下網(wǎng)絡(luò)編程的理解和掌握。 第二章、 Windows Socket 網(wǎng)絡(luò)編程的研究 2.1 TCP/IP 體系結(jié)構(gòu) 2.2.1 TCP/IP 簡(jiǎn)介 TCP/IP 作為 Internet 的核心協(xié)議,通過(guò)近二十多年的發(fā)展已日漸成熟, 并被廣泛應(yīng)用于局域網(wǎng)和廣域網(wǎng)中,目前已成為事實(shí)上的國(guó)際標(biāo)準(zhǔn)
8、。 TCP/IP 協(xié) 議集確立了 Internet 的技術(shù)基礎(chǔ)。 TCP/IP 協(xié)議主要作用于 OSI 網(wǎng)絡(luò)參考模型中的網(wǎng)絡(luò)層(第 3 層)、傳輸 層(第 4 層)和應(yīng)用層(第 7 層)。數(shù)據(jù)鏈路層(第 2 層)的功能主要應(yīng)用于 其它協(xié)議如以太網(wǎng)(Ethernet )、ATM 幀中繼(Frame Relay),以及多數(shù)供 應(yīng)商特定協(xié)議等。 TCP/IP 充分支持所有通用第 2 層協(xié)議。 TCP/IP 組中的應(yīng)用 程序通常直接運(yùn)行于傳輸層協(xié)議 TCP 或 UDP 上面,并不需要表示層(第 6 層)和會(huì)話層(第 5 層)的支持。 2.2.2 TCP/IP 的特點(diǎn) TCP/IP協(xié)議的核心部分是傳輸層
9、協(xié)議(TCP、UDP)網(wǎng)絡(luò)層協(xié)議(IP)和物理 接口層,這三層通常是在操作系統(tǒng)內(nèi)核中設(shè)計(jì)。因此用戶一般不涉及。編程 時(shí),編程界面有兩種形式:一、是由內(nèi)核心直接提供的系統(tǒng)調(diào)用;二、使用以 庫(kù)函數(shù)方式提供的各種函數(shù)。前者為核內(nèi)設(shè)計(jì),后者為核外設(shè)計(jì)。用戶服務(wù)要 通過(guò)核外的應(yīng)用程序才能設(shè)計(jì),所以要使用套接字 (socket) 來(lái)設(shè)計(jì)。 2.2 基本套接字 下面給出幾個(gè)基本的套接字,這些套接字的使用貫穿了網(wǎng)絡(luò)編程的始末,主 導(dǎo)了數(shù)據(jù)通信的過(guò)程。這將在以后的篇幅中會(huì)給出更詳細(xì)的使用說(shuō)明。 1、創(chuàng)建套接字 socket() 功能:使用前創(chuàng)建一個(gè)新的套接字 格式: SOCKET PASCAL FAR sock
10、et(int af,int type,int procotol)。 參數(shù): af: 通信發(fā)生的區(qū)域 type: 要建立的套接字類型 procotol: 使用的特定協(xié)議 2、指定本地地址 bind() 功能:將套接字地址與所創(chuàng)建的套接字號(hào)聯(lián)系起來(lái)。 格 式: int PASCALFAR bind(SOCKET s,const struct sockaddr FAR name,int namelen) 。 參數(shù): s: 是由 socket() 調(diào)用返回的并且未作連接的套接字描述符(套接字 號(hào))。 其它:沒(méi)有錯(cuò)誤, bind() 返回 0,否則 SOCKET_ERROR 地址結(jié)構(gòu)說(shuō)明: struct
11、 sockaddr_in short sin_family 。AF_INET u_short sin_port 。 /16 位端口號(hào),網(wǎng)絡(luò)字節(jié)順序 struct in_addr sin_addr 。 /32 位 IP 地址,網(wǎng)絡(luò)字節(jié)順序 char sin_zero8 。 / 保留 3、建立套接字連接 connect() 和 accept() 功能:共同完成連接工作 格式: int PASCAL FAR connect(SOCKET s,const struct sockaddr FAR * name,int namelen) 。 SOCKETPASCALFAR accept(SOCKET s,
12、struct sockaddr FAR * name,int FAR * addrlen) 。 參數(shù):同上 4、監(jiān)聽(tīng)連接 listen() 功能:用于面向連接服務(wù)器,表明它愿意接收連接。 格式:int PASCAL FAR listen(SOCKET s, int backlog)。 5、數(shù)據(jù)傳輸 send() 與 recv() 功能:數(shù)據(jù)的發(fā)送與接收 格式 :int PASCAL FAR send(SOCKET s,const char FAR * buf,int len,int flags) 。 int PASCAL FAR recv(SOCKET s,const char FAR * b
13、uf,int len,int flags) 。 參數(shù): buf: 指向存有傳輸數(shù)據(jù)的緩沖區(qū)的指針。 6、多路復(fù)用 select() 功能:用來(lái)檢測(cè)一個(gè)或多個(gè)套接字狀態(tài)。 格式: int PASCAL FAR select(int nfds,fd_set FAR * readfds,fd_set FAR * writefds, fd_set FAR * exceptfds,const struct timeval FAR * timeout)。 參數(shù): readfds: 指向要做讀檢測(cè)的指針 writefds: 指向要做寫(xiě)檢測(cè)的指針 exceptfds: 指向要檢測(cè)是否出錯(cuò)的指針 timeout
14、: 最大等待時(shí)間 7、關(guān)閉套接字 closesocket() 功能:關(guān)閉套接字 s 格式: BOOL PASCAL FAR closesocket(SOCKET s。) 2.3 客戶機(jī) /服務(wù)器模式 在 TCP/IP 網(wǎng)絡(luò)中兩個(gè)進(jìn)程間的相互作用的主機(jī)模式是客戶機(jī) / 服務(wù)器模式 (Client/Server model) 。該模式的建立基于以下兩點(diǎn): 1、非對(duì)等作用; 2、通 信完全是異步的??蛻魴C(jī) / 服務(wù)器模式在操作過(guò)程中采取的是主動(dòng)請(qǐng)示方式: 首先服務(wù)器方要先啟動(dòng),并根據(jù)請(qǐng)示提供相應(yīng)服務(wù),過(guò)程如下所示: 1、打開(kāi)一通信通道并告知本地主機(jī),它愿意在某一個(gè)公認(rèn)地址上接收客戶請(qǐng) 求。 2、等待
15、客戶請(qǐng)求到達(dá)該端口 3、接收到重復(fù)服務(wù)請(qǐng)求,處理該請(qǐng)求并發(fā)送應(yīng)答信號(hào)。 4、返回第二步,等待另一客戶請(qǐng)求 5、關(guān)閉服務(wù)器。 客戶方: 1、打開(kāi)一通信通道,并連接到服務(wù)器所在主機(jī)的特定端口。 2、向服務(wù)器發(fā)送服務(wù)請(qǐng)求報(bào)文,等待并接收應(yīng)答;繼續(xù)提出請(qǐng)求 3、請(qǐng)求結(jié)束后關(guān)閉通信通道并終止。 2.4 WINDOWS SOCKE程S序設(shè)計(jì) 2.4.1 WINDOWS SOCKETS AP簡(jiǎn)介 VC+寸網(wǎng)絡(luò)編程的支持有 socket支持,Winlnet支持,MAPI和ISAPI支持 等。其中, Windows Sockets API 是 TCP/IP 網(wǎng)絡(luò)環(huán)境里,也是 Internet 上進(jìn) 行開(kāi)發(fā)最為通
16、用的API。最早美國(guó)加州大學(xué) Berkeley分校在UNIX下為TCP/IP 協(xié)議開(kāi)發(fā)了一個(gè) API,這個(gè)API就是著名的Berkeley Socket 接口 (套接字)。 在桌面操作系統(tǒng)進(jìn)入 Windows時(shí)代后,仍然繼承了 Socket方法。在TCP/IP網(wǎng) 絡(luò)通信環(huán)境下, Socket 數(shù)據(jù)傳輸是特殊的 I/O ,它也相當(dāng)于文件描述符,具有 一個(gè)類似于打開(kāi)文件的函數(shù)調(diào)用 -socket() ??梢赃@樣理解: Socket 實(shí)際上是 一個(gè)通信端點(diǎn),通過(guò)它,用戶的 Socket 程序可以通過(guò)網(wǎng)絡(luò)和其他的 Socket 應(yīng) 用程序通信。 Socket 存在于一個(gè) 通信域 ( 為描述一般的線程如
17、何通過(guò) Socket 進(jìn)行通信而引入的抽象概念 )里,并且與另一個(gè)域的 Socket 交換數(shù)據(jù)。 Socket 有三類。第是 SOCK_STREA流式),提供面向連接的可靠的通信服務(wù),比如 telnet,http 。第二種是SOCK_DGRAM據(jù)報(bào)),提供無(wú)連接不可靠的通信,比 如UDP第三種是SOCK_RA原始),主要用于協(xié)議的開(kāi)發(fā)和測(cè)試,支持通信底 層操作,比如對(duì)IP和ICMP的直接訪問(wèn)。 2.4.1 WINDOWS SOCKET機(jī) 希 9 1 、異步選擇機(jī)制: WINDOWS SOCKE異步選擇函數(shù)提供了消息機(jī)制的網(wǎng)絡(luò)事件選擇,當(dāng)使 用它登記網(wǎng)絡(luò)事件發(fā)生時(shí),應(yīng)用程序相應(yīng)窗口函數(shù)將收到一個(gè)
18、消息,消息中指 示了發(fā)生的網(wǎng)絡(luò)事件,以及與事件相關(guān)的一些信息。 WINDOWS SOCKE提供了一個(gè)異步選擇函數(shù) WSAAsyncSelect(),用它來(lái)注 冊(cè)應(yīng)用程序感興趣的網(wǎng)絡(luò)事件,當(dāng)這些事件發(fā)生時(shí),應(yīng)用程序相應(yīng)的窗口函數(shù) 將收到一個(gè)消息。 函數(shù)結(jié)構(gòu)如下: int PASCAL FAR WSAAsyncSelect(SOCKET s,HWND hWnd,unsigned int wMsg,long lEvent) 。 參數(shù)說(shuō)明: hWnd窗口句柄 wMsg需要發(fā)送的消息 lEvent :事件(以下為事件的內(nèi)容) 值: 含義: FD_READ期望在套接字上收到數(shù)據(jù)(即讀準(zhǔn)備好)時(shí)接到通知 F
19、D_WRITE期望在套接字上可發(fā)送數(shù)據(jù)(即寫(xiě)準(zhǔn)備好)時(shí)接到通知 FD_OOB期望在套接字上有帶外數(shù)據(jù)到達(dá)時(shí)接到通知 FD_ACCEP期望在套接字上有外來(lái)連接時(shí)接到通知 FD_CONNEC期望在套接字連接建立完成時(shí)接到通知 FD_CLOS期望在套接字關(guān)閉時(shí)接到通知 例如:我們要在套接字讀準(zhǔn)備好或?qū)憸?zhǔn)備好時(shí)接到通知,語(yǔ)句如下: rc=WSAAsy ncSelect(s,hWnd,wMsg,FD_READ|FD_WRIT。) 如果我們需要注銷對(duì)套接字網(wǎng)絡(luò)事件的消息發(fā)送,只要將 lEvent 設(shè)置為 0 。 2、異步請(qǐng)求函數(shù) 在Berkeley Sockets中請(qǐng)求服務(wù)是阻塞的,WINDOWS SIC
20、KETS 了支持 這一類函數(shù)外,還增加了相應(yīng)的異步請(qǐng)求函數(shù) (WSAAsyncGetXByY(。) )。 3、阻塞處理方法 WINDOWS SOCKE為了設(shè)計(jì)當(dāng)一個(gè)應(yīng)用程序的套接字調(diào)用處于阻塞時(shí),能 夠放棄CPU讓其它應(yīng)用程序運(yùn)行,它在調(diào)用處于阻塞時(shí)便進(jìn)入一個(gè)叫“HOO” 的例程,此例程負(fù)責(zé)接收和分配 WINDOW消息,使得其它應(yīng)用程序仍然能夠接 收到自己的消息并取得控制權(quán)。 WINDOW是非搶先的多任務(wù)環(huán)境,即若一個(gè)程序不主動(dòng)放棄其控制權(quán),別 的程序就不能執(zhí)行。因此在設(shè)計(jì) WINDOWS SOCKE程序時(shí),盡管系統(tǒng)支持阻塞 操作, 但還是反對(duì)程序員使用該操作。 但由于 SUN 公司下的 Be
21、rkeley Sockets的套接字默認(rèn)操作是阻塞的,WINDOW作為移植的SOCKETS也不可避 免對(duì)這個(gè)操作支持。 在WINDOWS SOCKE設(shè)計(jì)中,對(duì)于不能立即完成的阻塞操作做如下處理: DLL初始化一循環(huán)操作。在循環(huán)中,它發(fā)送任何WINDOWS肖息,并檢查這個(gè) WINDOWS SOCKE用是否完成,在必要時(shí),它可以放棄CPU讓其它應(yīng)用程序 執(zhí)行(當(dāng)然使用超線程的CPU就不會(huì)有這個(gè)麻煩了)。我們可以調(diào)用 WSACancelBlockingCall() 函數(shù)取肖此阻塞操作。 在WINDOWS SOCKETS有一個(gè)默認(rèn)的阻塞處理例程 BlockingHook() 簡(jiǎn)單地 獲取并發(fā)送 WIN
22、DOW消息。如果要對(duì)復(fù)雜程序進(jìn)行處理,WINDOWS SOCKE中S 還有 WSASetBlockingHook() 提供用戶安裝自己的阻塞處理例程能力;與該函 數(shù)相對(duì)應(yīng)的則是SWAUnhookBlockingHook(),它用于刪除先前安裝的任何阻塞 處理例程,并重新安裝默認(rèn)的處理例程。請(qǐng)注意,設(shè)計(jì)自己的阻塞處理例程 時(shí),除了函數(shù) WSACancelBlockingHook() 之外,它不能使用其它的 WINDOWS SOCKETS AP函數(shù)。在處理例程中調(diào)用 WSACancelBlockingHook()函數(shù)將取消 處于阻塞的操作,它將結(jié)束阻塞循環(huán)。 4、出錯(cuò)處理 WINDOWS SOCK
23、E為了和以后多線程環(huán)境( WINDOWS/UNIX兼容,它提供 了兩個(gè)出錯(cuò)處理函數(shù)來(lái)獲取和設(shè)置當(dāng)前線程的最近錯(cuò)誤號(hào)。( WSAGetLastEror() 和 WSASetLastError() ) 5、啟動(dòng)與終止 使用函數(shù) WSAStartup() 和 WSACleanup() 啟動(dòng)和終止套接字 第三章、網(wǎng)絡(luò)通信模塊分析 3.1 網(wǎng)絡(luò)通信程序設(shè)計(jì)過(guò)程 在調(diào)用了 Windows sockets的啟動(dòng)函數(shù) WSACIeanup(之后才能進(jìn)行其他的 Socket 系統(tǒng)調(diào)用,但啟動(dòng)函數(shù) WSAStartup() 是為了建立與 Windows Sockets DLL 的連接,因此在 VC+6.0 所建立
24、工程的工程設(shè)置中的連接的庫(kù)模塊必須進(jìn) 行設(shè)置,在其中的link欄內(nèi)的對(duì)象/庫(kù)模塊中加入“ Ws2_32.lib ”,才能真正 建立建立與 Windows Sockets DLL 的連接。 其他的Socket系統(tǒng)調(diào)用包括創(chuàng)建Socket、將創(chuàng)建的Socket與本地端口綁 定、建立 Socket 連接服務(wù)器、監(jiān)聽(tīng)是否有連接、請(qǐng)求數(shù)據(jù)的可控緩沖發(fā)送和可 控緩沖接收,到最后關(guān)閉Socket。具體流程圖如1所示。 首先在服務(wù)器方,利用 socket() 函數(shù)建立流式套接字,返回套接字號(hào) s, 接著利 用 bind() 函數(shù)將套接字 s 與本地地址綁定,緊接著利用 listen(0 函數(shù)通知 TCP, 監(jiān)
25、聽(tīng)客戶方, 服務(wù)器準(zhǔn)備接收連接, 沒(méi)有連接的話, 服務(wù)器方通過(guò) closesocket() 關(guān)閉套接字 s, 服務(wù)結(jié)束。有連接的話 ,在客戶方,通過(guò) socket() 函數(shù)建立流式套接字 s, 此時(shí)在服務(wù)器方,建立連接,通過(guò) accept() 返回,得到 新的套接字 ns, 客戶方通過(guò) connect() 將套接字 s 與遠(yuǎn)程地址連接 , 此時(shí)服務(wù)器 方/客戶方在 ns/s 上讀/ 寫(xiě)數(shù)據(jù),直到交換完成。交換完成后,服務(wù)器方 / 客戶 方關(guān)閉套接字 ns/s, 最后服務(wù)器方通過(guò) closesocket() 關(guān)閉最初套接字 s, 服務(wù) 結(jié)束。 具體設(shè)計(jì)過(guò)程如圖 1 所示,具體設(shè)計(jì)代碼將會(huì)在下面介
26、紹: 面向連接的套接字的系統(tǒng)調(diào)用流程圖 3.2 網(wǎng)絡(luò)通信程序設(shè)計(jì)核心代碼分析 3.2.1 通信設(shè)計(jì)代碼分析 先分析服務(wù)器端。 首先定義初始化網(wǎng)絡(luò)函數(shù),也就是 WINDOWS SOCKETS 的啟動(dòng) 在所有 WINDOWS SOCKETS中,只有啟動(dòng)函數(shù) WSAStartup() 和終止函 數(shù) WSACleanup() 是必須使用的。 啟動(dòng)函數(shù)必須是第一個(gè)使用的函數(shù),而且它允許指定 WINDOWS SOCKETS API的版本,并獲得SOCKETS勺特定的一些技術(shù)細(xì)節(jié)。本結(jié)構(gòu)如下: int PASCAL FAR WSAStartup(WORD wVersionRequested, LPWSADA
27、TA lpWSAData)。 其中wVersionRequested 保證SOCKETS可正常運(yùn)行的 DLL版本,如果不支 持,則返回錯(cuò)誤信息。 設(shè)計(jì)代碼如下,主要是進(jìn)行 WSAStartup() 函數(shù) 的調(diào)用 WORD wVersionRequested /定義版本信息變量 WSADATA wsaData。 / 定義數(shù)據(jù)信息變量 int err 。 / 定義錯(cuò)誤號(hào)變量 wVersionRequested = MAKEWORD(1,1) 。 / 給版本信息賦值 err = WSAStartup(wVersionRequested, &wsaData) 。 / 給錯(cuò)誤信息賦值 if(err!=0
28、) return 。 / 告訴用戶找不到合適的版本 / 確認(rèn) WINDOWS SOCKETS D支持 1.1 版本 /DLL 版本可以高于 1.1 / 系統(tǒng)返回的版本號(hào)始終是最低要求的 1.1 ,即應(yīng)用程序與 DLL 中可支持 的最低版本號(hào) if(LOBYTE(wsaData.wVersion)!= 1| HIBYTE(wsaData.wVersion)!=1) WSACleanup() 。 / 告訴用戶找不到合適的版本 return 。 /WINDOWS SOCKETS DLL 被進(jìn)程接受,可以進(jìn)入下一步操作 既然啟動(dòng)了到最后就需要調(diào)用WSACIeanup(函數(shù)來(lái)終止,關(guān)閉函數(shù)使用時(shí),任 何
29、打開(kāi)并已連接的 SOCK_STREA套接字被復(fù)位,但那些已由closesocket() 函數(shù)關(guān)閉的但仍有未發(fā)送數(shù)據(jù)的套接字不受影響,未發(fā)送的數(shù)據(jù)仍將被發(fā)送。 程序運(yùn)行時(shí)可能會(huì)多次調(diào)用 WSAStartuo() 函數(shù),但必須保證每次調(diào)用時(shí)的 wVersionRequested 的值是相同的。 接著是創(chuàng)建服務(wù)器端套接字,主要代碼如下: SOCKET ServerSock。 / 服務(wù)器端 Socket ServerSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) 。 if(ServerSock MessageBox( 創(chuàng) 建 套 closesocket
30、(ServerSock) WSACleanup() return 套接字創(chuàng)建好之后就是與本地地址綁定: sockaddr_in localaddr 。 localaddr.sin_family = AF_INET 。 localaddr.sin_port = htons(8888) 突 INVALID_SOCKET) 接 字 失 敗 !)。 。 。 FALSE。 file:/ 端口號(hào)不要與其他應(yīng)用程序沖 if(bind(ServerSock ,(struct sockaddr*)&localaddr,sizeof(sockaddr) = = SOCKET_ERROR) MessageBox(綁
31、定地址失敗!)。 closesocket(ServerSock) 。 WSACleanup()。 return FALSE 。 接下來(lái)就是對(duì)SOCKE的設(shè)置,本程序使用的數(shù)據(jù)傳輸模式是異步非阻塞模式, 設(shè)置好之后就是監(jiān)聽(tīng)客戶端信息,主要代碼如下 if(WSAAsyncSelect(ServerSock, m_hWnd, NETWORK_EVENT, FD_ACCEPT | FD_CLOSE | FD_READ | FD_WRITE) = SOCKET_ERROR) MessageBox(注冊(cè)網(wǎng)絡(luò)異步事件失敗!)。 WSACleanup()。 return FALSE 。 listen(Serv
32、erSock, 5)。 / 設(shè)置偵聽(tīng)模式 return TRUE 。 其中m_hWnc為應(yīng)用程序的主對(duì)話框或主窗口的句柄。 這就要說(shuō)到網(wǎng)絡(luò)異步函數(shù)的回調(diào)函數(shù),主要代碼內(nèi)容如下: OnNetEvent(WPARAM wParam, LPARAM lParam) / 調(diào)用 Winsock API 函數(shù),得到網(wǎng)絡(luò)事件類型 int iEvent = WSAGETSELECTEVENT(lParam)。 / 調(diào)用 Winsock API 函數(shù),得到發(fā)生此事件的客戶端套接字 SOCKET CurSock= (SOCKET)wParam switch(iEvent) case FD_ACCEPT: / 客戶
33、端連接請(qǐng)求事件 OnAccept(CurSock) 。 break 。 case FD_CLOSE: / 客戶端斷開(kāi)事件 : OnClose(CurSock) 。 break 。 case FD_READ: / 網(wǎng)絡(luò)數(shù)據(jù)包到達(dá)事件 OnReceive(CurSock) 。 break 。 case FD_WRITE: / 發(fā)送網(wǎng)絡(luò)數(shù)據(jù)事件 OnSend(CurSock)。 break 。 default: break 。 另外,發(fā)生在相應(yīng) Socket 上的各種網(wǎng)絡(luò)異步事件的處理函數(shù),其中 OnAccept 傳進(jìn)來(lái)的參數(shù)是服務(wù)器端創(chuàng)建的套接字, OnClose() 、OnReceive() 和
34、 OnSend() 傳進(jìn)來(lái)的參數(shù)均是服務(wù)器端在接受客戶端連接時(shí)新創(chuàng)建的用與此客戶端通信的 Socket 。定義 OnAccept() 函數(shù)來(lái)接受連接請(qǐng)求,并保存與發(fā)起連接請(qǐng)求的客戶 端進(jìn)行通信Socket,為新的socket注冊(cè)異步事件。定義 OnSend()函數(shù)來(lái)給客 戶端發(fā)數(shù)據(jù)時(shí)做相關(guān)預(yù)處理。 定義 OnReceive() 函數(shù)來(lái)讀出網(wǎng)絡(luò)緩沖區(qū)中的數(shù) 據(jù)包。定義 OnClose() 函數(shù)來(lái)結(jié)束與相應(yīng)的客戶端的通信,釋放相應(yīng)資源。 接下來(lái)講講客戶端方。 首先初始化網(wǎng)絡(luò)部分,帶不需要將套接字設(shè)置為監(jiān)聽(tīng)模式。注冊(cè)異步事件時(shí), 沒(méi)有FD_ACCEPT但增加了 FD_CONNE事件,因此沒(méi)有 OnA
35、ccept()函數(shù),但增 加了 OnConnect() 函數(shù)。向服務(wù)器發(fā)出連接請(qǐng)求時(shí),使用 connect() 函數(shù),連接 成功后,會(huì)響應(yīng)到 On Co nn ect()函數(shù)中。下面是 OnConn ect()函數(shù)的定義,傳進(jìn) 來(lái)的參數(shù)是客戶端 Socket 和服務(wù)器端發(fā)回來(lái)的連接是否成功的標(biāo)志。 void CXFQQClientDlg:OnConnect(SOCKET CurSock, int error) if(0 = = error) if(CurSock = = ClntSock) MessageBox(連接服務(wù)器成功!)。 另外定義On Receive。函數(shù)來(lái)處理網(wǎng)絡(luò)數(shù)據(jù)到達(dá)事件。定
36、義On Se nd()函數(shù)來(lái)處 理發(fā)送網(wǎng)絡(luò)數(shù)據(jù)事件。定義 OnClose()函數(shù)來(lái)處理服務(wù)器的關(guān)閉事件。 3.2.2 數(shù)據(jù)傳輸代碼分析 在服務(wù)器方用WSASend()函數(shù)來(lái)發(fā)送數(shù)據(jù),使用 WSARecv()來(lái)接收數(shù)據(jù)。 Windows Sockets 不鼓勵(lì)用戶使用阻塞方式傳輸數(shù)據(jù),因?yàn)槟菢涌赡軙?huì)阻塞整 個(gè) Windows 環(huán)境。發(fā)送數(shù)據(jù)主要代碼如下所示: if (WSASend(pSI-s, &(pSI-wsaBuf), 1,&dwSendBytes, 0,&(pSI-o), NULL) = SOCKET_ERROR) if (WSAGetLastError() != ERROR_IO_PE
37、NDING) PrintSystemError(WSASend() 失敗) 。 / 自定義出錯(cuò)顯示 函數(shù) return -1。 其中 pSI 的類型是自定義的網(wǎng)絡(luò)信息結(jié)構(gòu),包含網(wǎng)絡(luò)的所有信息。結(jié)構(gòu)定 義如下: typedef struct char buffRecvDATA_BUFSIZE 。 char buffSendDATA_BUFSIZE 。 WSABUF wsaBuf/指向WSABU拮構(gòu)數(shù)組的指針 SOCKET s / 標(biāo)識(shí)一個(gè)已連接套接口的描述字。 WSAOVERLAPPED/O 指向 WSAOVERLAPPED 結(jié)構(gòu)的指針 DWORD dwBytesSend DWORD dwByt
38、esRecv int nStatus 。 char ip16。 BOOL bLoggedIn。 SOCKET_INF,*LPSOCKET_INF 若無(wú)錯(cuò)誤發(fā)生且發(fā)送操作立即完成,則WSASe nd(函數(shù)返回所發(fā)送的字節(jié) 數(shù)。(注意該數(shù)目可能小于 len 參數(shù)所指定的值)。如果連接結(jié)束,則返回 0。請(qǐng)注意在這種情況下完成指示(啟動(dòng)指定的完成例程或設(shè)置一個(gè)事件對(duì)象) 將早已發(fā)生。否則的話,將返回SOCKET_ERROR誤,應(yīng)用程序可通過(guò) WSAGetLastError() 來(lái)獲取相應(yīng)的錯(cuò)誤代碼 , 返回 -1。錯(cuò)誤代碼 WSA_IO_PENDING 表示重疊操作成功啟動(dòng),過(guò)后將有完成指示。任何其他
39、的錯(cuò)誤表示重疊操作未 能成功地啟動(dòng),以后也不會(huì)有完成指示。 服務(wù)器方接收數(shù)據(jù)代碼如下: if (WSARecv(pSI-s, &(pSI-wsaBuf), 1, &dwRecvBytes, &dwFlags,&(pSI-o), NULL) = SOCKET_ERROR) if (WSAGetLastError() != ERROR_IO_PENDING) PrintSystemError(WSARecv() 失敗) 。 return -1 。 若無(wú)錯(cuò)誤發(fā)生且接收操作立即完成,則WSARecv(函數(shù)返回所接收的字節(jié) 數(shù)。如果連接結(jié)束,則返回0。請(qǐng)注意在這種情況下完成指示(啟動(dòng)指定的完 成例程或設(shè)
40、置一個(gè)事件對(duì)象)將早已發(fā)生。否則的話,將返回SOCKET_ERR錯(cuò)R 誤,應(yīng)用程序可通過(guò) WSAGetLastError() 來(lái)獲取相應(yīng)的錯(cuò)誤代碼。錯(cuò)誤代碼 WSA_IO_PENDIN表示重疊操作成功啟動(dòng),過(guò)后將有完成指示。任何其他的錯(cuò)誤 表示重疊操作未能成功地啟動(dòng),以后也不會(huì)有完成指示。 在客戶方,利用 send() 和 recv() 來(lái)發(fā)送和接收消息, 發(fā)送代碼如下 : if(send(m_cliSocket,buff,sizeof(buff),0) = SOCKET_ERROR) closesocket(m_cliSocket) 。 return 。 若無(wú)錯(cuò)誤發(fā)生, send() 返回所
41、發(fā)送數(shù)據(jù)的總數(shù)(請(qǐng)注意這個(gè)數(shù)字可能小于 len中所規(guī)定的大小)。否則的話,返回SOCKET_ERR錯(cuò)誤,應(yīng)用程序可通過(guò) WSAGetLastError() 獲取相應(yīng)錯(cuò)誤代碼。 接收代碼如下: if(recv(cliSock,buff,sizeof(buff),0) = SOCKET_ERROR) closesocket(cliSock) 。 return FALSE 。 若無(wú)錯(cuò)誤發(fā)生, recv() 返回讀入的字節(jié)數(shù)。如果連接已中止,返回 0。否 則的話,返回SOCKET_ERR錯(cuò)誤,應(yīng)用程序可通過(guò) WSAGetLastError()獲取相 應(yīng)錯(cuò)誤代碼。 3.2.4 出錯(cuò)處理 自定義 Prin
42、tSystemError 函數(shù)來(lái)顯示錯(cuò)誤信息 , 編寫(xiě)方式如下: void PrintSystemError(CString str) char strSystemError40 。 CXFQQServerDlg *dlg=(CXFQQServerDlg*) AfxGetApp()- GetMainWnd()。 memset(strSystemError,0,sizeof(strSystemError) sprintf(strSystemError,系統(tǒng):%s,str)。 dlg-m_list.l nsertStri ng(g_dwListCo un t+, strSystemError) d
43、lg-mist.SetTopl ndex(g_dwListCou nt-1)。 第四章、界面模塊分析 4.1服務(wù)器端界面模塊分析 服務(wù)器端界面如圖2所示 圖2服務(wù)器界面 如圖2所示,在服務(wù)器界面設(shè)計(jì)上設(shè)計(jì)很簡(jiǎn)單,通過(guò)一個(gè)列表框來(lái)顯示服 務(wù)器信息,一個(gè)啟動(dòng)按鈕來(lái)啟動(dòng)服務(wù)器,一個(gè)退出按鈕關(guān)閉服務(wù)器。 如果服務(wù)器啟動(dòng)沒(méi)有什么問(wèn)題就會(huì)在列表框中顯示“創(chuàng)建服務(wù)器成功”字 樣。 當(dāng)用戶登陸,就會(huì)在列表框中顯示如“ 連接,接受 : USER 1001 接受 : PASS 1001 三行字樣,如果登陸成 功,在列表框中就會(huì)顯示“接受 127.0.0.
44、1 : LIST”字樣,獲取在線用戶列 表。如果登陸失敗,在列表框中就會(huì)顯示如“斷開(kāi)”字樣。 在注冊(cè)用戶的時(shí)候,如果注冊(cè)成功,在列表框中就會(huì)顯示如“ADD USER 1001 SUCCESS ,如果失敗,就會(huì)在列表框中顯示“ ADD USER FAIL 當(dāng)修改用戶信息的時(shí)候就會(huì)在列表框中顯示“接受 : GINF 1001” ,如果修改成功,就會(huì)在列表框中顯示“接受: UINF 1001”。 4.2客戶端界面模塊分析 客戶端界面主要包括用戶登陸界面、用戶注冊(cè)界面、在線用戶列表界面、 用戶聊天界面。 其中客戶端界面設(shè)計(jì)思路,主要設(shè)計(jì)過(guò)程如圖3所
45、示: 圖3客戶端界面輪廓 4.2.1用戶登陸界面分析 用戶登陸界面如圖4所示 Xl 用戶號(hào)碼: 用戶密碼: 服務(wù)器IP: 廠保存窖碼 取消 I 注冊(cè)向?qū)?登錄 圖4用戶登陸界面 如圖4顯示,當(dāng)單擊“登陸”按鈕進(jìn)行用戶的登陸: 當(dāng)用戶號(hào)碼未填寫(xiě)時(shí),會(huì)提示“請(qǐng)輸入用戶號(hào)碼”。 當(dāng)用戶密碼未填寫(xiě)時(shí),會(huì)提示“請(qǐng)輸入用戶密碼”。 當(dāng)服務(wù)器IP未填寫(xiě)或格式不正確,會(huì)提示“請(qǐng)?zhí)顚?xiě)正確的服務(wù)器地址”。 勾選“保護(hù)密碼”,在下次打開(kāi)該登陸界面時(shí),在輸入框里自動(dòng)顯示上次 登陸時(shí)輸入的三項(xiàng)信息。 用戶信息填寫(xiě)完畢后,按“登陸”按鈕,如果與服務(wù)器連接失敗,就會(huì)提示如 “連接失?。翰荒苓B接上的服務(wù)器”
46、 登陸成功就會(huì)進(jìn)入在線用戶列表界面,如圖6所示.o 單擊“取消”按鈕退出登陸界面。 單擊“注冊(cè)向?qū)А卑粹o就可以進(jìn)入用戶注冊(cè)界面,如圖5所示。 4.2.2用戶注冊(cè)界面分析 如圖4所示,單擊“注冊(cè)向?qū)А卑粹o,進(jìn)入用戶注冊(cè)界面。如圖 5所示 圖5用戶注冊(cè)界面 所有信息都必須填寫(xiě),當(dāng)某項(xiàng)信息未填時(shí),會(huì)提示“請(qǐng)輸入xxx,并在同 時(shí)將“用戶密碼”和“確認(rèn)密碼”二欄內(nèi)容清空。 當(dāng)點(diǎn)擊“注冊(cè)”按鈕時(shí),如果注冊(cè)成功,提示“注冊(cè)成功,你的用戶號(hào)碼 是 XXXX ” 如果注冊(cè)失敗,若是服務(wù)器未啟動(dòng)或連接失敗,則會(huì)提示“注冊(cè)失敗,服 務(wù)器未啟動(dòng)或連接失敗?!?單擊“取消”按鈕,返回登陸界面。 4.3在線用戶列表界面
47、分析 如圖4所示,當(dāng)?shù)顷懗晒r(shí)進(jìn)入在線用戶列表界面,如圖 6所示。 -lr I x | 圖6在線用戶列表界面 當(dāng)單擊自己用戶號(hào)碼時(shí),在列表下顯示“修改”按鈕,單擊該按鈕,顯示圖7 所示的自己的用戶信息并可以進(jìn)行修改。 靈認(rèn)顯2d 修改| 取消| 圖7修改用戶資料界面 能修改的所有內(nèi)容格式必須正確而且不能未空,否則單擊“修改”后會(huì)提 示“修改沒(méi)有成功! ”修改成功就會(huì)提示“修改成功”,但不管成功與否,都 會(huì)返回用戶列表界面,單擊用戶列表界面的“刷新”按鈕,如果修改成功,其 中被修改的信息會(huì)改變。單擊取消按鈕,返回用戶列表界面 當(dāng)單擊其他用戶號(hào)碼時(shí),在列表下顯示“查看”按鈕,單擊該按鈕,顯示 如圖
48、8所示的其他用戶信息 圖8用戶信息查看界面 其他用戶的所有信息都不能修改,你可以單擊“加為好友”按鈕來(lái)增加好 友。添加成功后會(huì)提示“增加好友成功”,否則提示“增加好友失敗”。單擊 “取消”按鈕返回在線用戶列表界面。 如圖6所示,單擊“進(jìn)入聊天”按鈕,可以進(jìn)入用戶聊天界面,如圖 示。 424用戶聊天界面分析 用戶聊天界面如圖9所示 圖9用戶聊天界面 首先選擇你要聊天的好友。通過(guò)“發(fā)送”按鈕發(fā)送你要講的內(nèi)容,通過(guò) “聊天記錄”按鈕/ “關(guān)閉記錄”按鈕來(lái)顯示/關(guān)閉聊天記錄。單擊“傳送文 件”按鈕,跳出文件目錄,讓你選擇你要傳送的文件。如圖10所示 圖10傳送文件界面 第五章、數(shù)據(jù)庫(kù)模塊分析 5.1
49、數(shù)據(jù)庫(kù)的選擇 選擇一個(gè)好的應(yīng)用程序?qū)σ粋€(gè)應(yīng)用系統(tǒng)來(lái)說(shuō)是非常重要的。應(yīng)用系統(tǒng)應(yīng)該 選擇哪種數(shù)據(jù)庫(kù)要根據(jù)系統(tǒng)的要求和企業(yè)的實(shí)際情況而定。目前,所有流行的 幾種大型關(guān)系型數(shù)據(jù)庫(kù)有 MS SQL Server、Oracle、DB2等。本系統(tǒng)使用 MS SQL Server,主要有以下幾點(diǎn)理由: 1) MS SQL Server比較容易使用,一般管理員較熟悉。 2) MS SQL Server有存儲(chǔ)過(guò)程、視圖等方便功能擴(kuò)展。 5.2 數(shù)據(jù)庫(kù)訪問(wèn)方法 本程序示通過(guò)用ADO來(lái)訪問(wèn)數(shù)據(jù)庫(kù),分別用ADC訪問(wèn)了數(shù)據(jù)庫(kù)的各個(gè)對(duì)象及 各方法。 5.3 ADC數(shù)據(jù)庫(kù)編程 5.3.1 ADC與 ADC接口簡(jiǎn)介 ADC是M
50、icrosoft為最新和最強(qiáng)大的數(shù)據(jù)訪問(wèn)范例 OLE DB而設(shè)計(jì)的,是 一個(gè)便于使用的應(yīng)用程序?qū)咏涌凇DO使您能夠編寫(xiě)應(yīng)用程序以通過(guò) OLE. DB 提供者訪問(wèn)和操作數(shù)據(jù)庫(kù)服務(wù)器中的數(shù)據(jù)。OLE DB是一組”組件對(duì)象模 型” (COM)接口,是新的數(shù)據(jù)庫(kù)低層接口,它封裝了ODBC勺功能,并以統(tǒng)一的 方式訪問(wèn)存儲(chǔ)在不同信息源中的數(shù)據(jù)。OLE DB是 Microsoft UDA(Universal Data Access)策略的技術(shù)基礎(chǔ)。OLE DB為任何數(shù)據(jù)源提供了高性能的訪問(wèn),這 些數(shù)據(jù)源包括關(guān)系和非關(guān)系數(shù)據(jù)庫(kù)、電子郵件和文件系統(tǒng)、文本和圖形、自定 義業(yè)務(wù)對(duì)象等等。OLE DB應(yīng)用程序編程接
51、口的目的是為各種應(yīng)用程序提供最佳 的功能,它并不符合簡(jiǎn)單化的要求。您需要的 API 應(yīng)該是一座連接應(yīng)用程序和 OLE DB 的橋梁,這就是 ActiveX Data Objects (ADO) 。 ADO庫(kù)包含三個(gè)基本接口:_Co nn ectio nPtr 接口、_Comma ndPtr接口和 _RecordsetPtr 接口。 _ConnectionPtr 接口返回一個(gè)記錄集或一個(gè)空指針。通常使用它來(lái)創(chuàng)建一 個(gè)數(shù)據(jù)連接或執(zhí)行一條不返回任何結(jié)果的 SQL 語(yǔ)句,如一個(gè)存儲(chǔ)過(guò)程。使用 _ConnectionPtr 接口返回一個(gè)記錄集不是一個(gè)好的使用方法。對(duì)于要返回記錄 的操作通常用 _Reco
52、rdserPtr 來(lái)設(shè)計(jì)。而用 _ConnectionPtr 操作時(shí)要想得到記 錄條數(shù)得遍歷所有記錄,而用 _RecordserPtr 時(shí)不需要。 _Comma ndPtr接口返回一個(gè)記錄集。它提供了簡(jiǎn)單的方法來(lái)執(zhí)行返回記錄 集的存儲(chǔ)過(guò)程和SQL語(yǔ)句。在使用_CommandPtr接口時(shí),你可以利用全局 _ConnectionPtr 接口,也可以在_CommandPtr接口里直接使用連接串。如果你 只執(zhí)行一次或幾次數(shù)據(jù)訪問(wèn)操作,后者是比較好的選擇。但如果你要頻繁訪問(wèn) 數(shù)據(jù)庫(kù),并要返回很多記錄集,那么,你應(yīng)該使用全局 _ConnectionPtr 接口創(chuàng) 建一個(gè)數(shù)據(jù)連接,然后使用_CommandP
53、t接口執(zhí)行存儲(chǔ)過(guò)程和SQL語(yǔ)句。 _RecordsetPtr 是一個(gè)記錄集對(duì)象。與以上兩種對(duì)象相比,它對(duì)記錄集提 供了更多的控制功能,如記錄鎖定,游標(biāo)控制等。同_Comma ndPtr接口一樣, 它不一定要使用一個(gè)已經(jīng)創(chuàng)建的數(shù)據(jù)連接,可以用一個(gè)連接串代替連接指針賦 給_RecordsetPtr的conn ection 成員變量,讓它自己創(chuàng)建數(shù)據(jù)連接。如果你要 使用多個(gè)記錄集,最好的方法是同Comma nd對(duì)象一樣使用已經(jīng)創(chuàng)建了數(shù)據(jù)連接 的全局_ConnectionPtr接口,然后使用_RecordsetPtr執(zhí)行存儲(chǔ)過(guò)程和SQL語(yǔ) 句。 在下面的代碼分析中將詳細(xì)介紹 ADO怎樣利用這幾個(gè)接口來(lái)
54、對(duì)數(shù)據(jù)庫(kù)SQL 進(jìn)行操作。 532使用ADO作SQL代碼分析 1、引入ADO庫(kù)文件 使用ADC前必須在工程的stdafx.h頭文件里用直接引入符號(hào)#import引入 ADO庫(kù)文件,以使編譯器能正確編譯。代碼如下所示: 用#import引入ADO庫(kù)文件 #importc:programfilescommonfilessystemadomsado15.dllno_nam espaces rename(EOF adoEOF) 這行語(yǔ)句聲明在工程中使用ADO但不使用ADO勺名字空間,并且為了避 免常數(shù)沖突,將常數(shù)EOF改名為adoEOF現(xiàn)在不需添加另外的頭文件,就可以 使用 ADO接 口了。 2、初始
55、化OLE/COM庫(kù)環(huán)境 必須注意的是,ADO庫(kù)是一組COM動(dòng)態(tài)庫(kù),這意味應(yīng)用程序在調(diào)用ADO 前,必須初始化 OLE/COM庫(kù)環(huán)境。在MFC應(yīng)用程序里,一個(gè)比較好的方法是在 應(yīng)用程序主類的Initlnstanee成員函數(shù)里初始化OLE/COM庫(kù)環(huán)境。 BOOL CXFQQClientAp:p :InitInstance() if(!AfxOlelnit()這就是初始化COM庫(kù) AfxMessageBox( “OLE初始化出錯(cuò)! ”)。 return FALSE 。 3、判斷數(shù)據(jù)庫(kù)的存在 使用USE語(yǔ)句,成功了就存在;不成功,就不存在。 代碼如下: try m_pConneet-Exeeute
56、( _bstr_t(USE lNSURANCE_2002),NULL, adCmdTextl adExecuteNoRecords )。 catch (_com_error &e) blSuccess=FALSE。 CString str= 數(shù)據(jù)庫(kù) INSURANCE_200不存在! n。 str+=e.Description() 。 :MessageBox(NULL,str,警告,MB_OK | MBCONWARNING) 4、連接數(shù)據(jù)庫(kù) 通過(guò)MS SQL SERVER 200創(chuàng)建數(shù)據(jù)庫(kù)名為 XFQQ接著在ODBC中添加數(shù)據(jù) 源,數(shù)據(jù)源名為XFQQ定義一個(gè)指向 Connection對(duì)象的指針
57、:_ConnectionPtr _pConnection 。連接代碼如下: HRESULT h。 try hr = m_pConnection.CreateInstance(ADODB.Connection) 。 / 創(chuàng) 建 Connection 對(duì)象 if(SUCCEEDED(hr) hr = m_pConnection-Open(DSN=XFQQ UID=sa。PWD= , 1)。 / 連接數(shù)據(jù)庫(kù) catch(_com_error e)/ 捕捉異常 CString errormessage 。 errormessage.Format( 連 接 數(shù) 據(jù) 庫(kù) 失 敗 !rn 錯(cuò) 誤 信 息 :%s,e.ErrorMessage() 。 AfxMessageBox(errormessage) 。 / 顯示錯(cuò)誤信息 3、判斷表的存在 判斷一個(gè)表是否存在,可以用是否成功地打開(kāi)它來(lái)判斷,代碼如下: try m_pRecordset-Open(_variant_t(mytable), _variant_t(IDispatch *)m_pConnection,true), adOpenKeyset, adLockOptimistic, adCmd
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 團(tuán)隊(duì)管理企業(yè)培訓(xùn)
- 二零二五年度企業(yè)兼職市場(chǎng)營(yíng)銷人員合同2篇
- 在線健康信息替代搜尋對(duì)老年人健康素養(yǎng)的影響研究-基于社會(huì)認(rèn)知理論
- 醫(yī)生年終工作總結(jié)
- 2025年度綠色建筑合作框架協(xié)議范本3篇
- 基于前景理論的大規(guī)模傳染疫情應(yīng)急管理決策研究
- 二零二五年P(guān)OS機(jī)租賃與移動(dòng)支付安全監(jiān)控合同3篇
- 臨床胃腸鏡術(shù)前術(shù)后護(hù)理要點(diǎn)
- Unit 4 Lesson 1My family photo(說(shuō)課稿)-2024-2025學(xué)年冀教版(2024)初中英語(yǔ)七年級(jí)上冊(cè)
- 全國(guó)冀教版信息技術(shù)三年級(jí)上冊(cè)新授課 二 畫(huà)大熊貓 說(shuō)課稿
- DB44∕T 2149-2018 森林資源規(guī)劃設(shè)計(jì)調(diào)查技術(shù)規(guī)程
- 肝移植的歷史、現(xiàn)狀與展望
- 商業(yè)定價(jià)表(含各商鋪價(jià)格測(cè)算銷售回款)
- 【化學(xué)】重慶市2021-2022學(xué)年高一上學(xué)期期末聯(lián)合檢測(cè)試題
- 供應(yīng)商物料質(zhì)量問(wèn)題賠償協(xié)議(終端)
- 單位工程質(zhì)量控制程序流程圖
- 部編版小學(xué)語(yǔ)文三年級(jí)(下冊(cè))學(xué)期課程綱要
- 化學(xué)工業(yè)有毒有害作業(yè)工種范圍表
- 洼田飲水試驗(yàn)
- 定置定位管理一
- 商票保貼協(xié)議
評(píng)論
0/150
提交評(píng)論