【正文】
ll describe shortly. This mechanism is not available on Windows NT .A significant benefit to using the AcceptEx call is the ability to receive data and accept a client connection in one call via the lpOutputBuffer parameter. This means that if a client connects and immediately sends data, AcceptEx will plete only after the connection is established and the client sends data. This can be ver。學(xué)生簽名:日 期:37 2009屆本科生畢業(yè)設(shè)計(jì)(論文)資料第二部分 外文資料翻譯Windows Sockets : Write Scalable Winsock Apps Using Completion Ports(excerpts)One of the most mon things a server does is accept connections from clients. The AcceptEx function is the only Winsock API capable of using overlapped I/O to accept connections on a socket. The interesting thing about AcceptEx is that it requires an additional socket as one of the parameters to the API. In a normal, synchronous accept function call, the new socket is the return value from the API. However, since AcceptEx is an overlapped operation, the accepted socket must be created (but not bound or connected) in advance, and passed to the API. A typical psuedocode snippet that uses AcceptEx might look like the following: do { Wait for a previous AcceptEx to plete Create a new socket and associate it with the pletion port Allocate context structure etc. Post an AcceptEx request.}while(TRUE)。感謝他們對(duì)我的關(guān)心、照顧和幫助。我非常感激張老師一直以來(lái)對(duì)我的幫助和教育,在這里我表示誠(chéng)摯的感激。致 謝時(shí)光流逝,歷經(jīng)幾個(gè)月的畢業(yè)設(shè)計(jì)接近了尾聲,我在期間學(xué)到了許多新知識(shí),課題分析與設(shè)計(jì)工作從開(kāi)題到順利完成,大到總體框架,小到某些細(xì)節(jié)的推敲,自始至終都受到張明老師的細(xì)心指導(dǎo)和關(guān)懷。還可以將很多事件觸發(fā)打包,這一系列的事件可以一個(gè)timer控件囊括,使用時(shí)候驅(qū)動(dòng)這個(gè)timer控件即可。參考文獻(xiàn) [1]汪保平. 用VB實(shí)現(xiàn)聊天討論室和點(diǎn)對(duì)點(diǎn)會(huì)話[J]. 電腦編程技巧與維護(hù), 1999:13.[2] Basic [M].人民郵電出版社 2002:3538,71.[3] Basic 程序設(shè)計(jì)教程[M].清華大學(xué)出版社 2000:1921.[4]Jeffrey P. Mc Manu. Visual Basic6數(shù)據(jù)庫(kù)訪問(wèn)技術(shù)[M].機(jī)械工業(yè)出版社. 2000:25.[5]郭振波. 深入淺出Visual Basic [M].人民郵電出版社2003:4546.[6] [M].清華大學(xué)出版社2002:6466.[7]鄭小玲. Access2003中文版實(shí)用教程[M].清華大學(xué)出版社 2004:5559.[8]查普爾. TCP/IP協(xié)議原理與應(yīng)用[M]. 清華大學(xué)出版社. 2005:1718.[9]俞承杭. 用VB開(kāi)發(fā)基于Winsock的聊天程序[J]. 計(jì)算機(jī)時(shí)代. 2000:2.[10] Basic 高級(jí)編程技巧[M].電子工業(yè)出版社 1999:41.[11]王留洋. VB中利用Winsock控件實(shí)現(xiàn)局域網(wǎng)通信[J].淮陰工學(xué)院學(xué)報(bào),2005:1 .[12] Basic數(shù)據(jù)庫(kù)開(kāi)發(fā)關(guān)鍵技術(shù)[M].人民郵電出版社 2004:2930.附 錄 Timer控件的靈活使用:Timer控件可以用作事件的循環(huán),用以檢查連接狀態(tài),一旦連接斷開(kāi),可以自動(dòng)進(jìn)行重連。由于它容易被人忽視,會(huì)使你極難發(fā)現(xiàn)并改正它,而大大影響編程的進(jìn)度。(3) 不要忽視任何一個(gè)小的支節(jié)。(2) 要養(yǎng)成良好的存盤(pán)和備份的習(xí)慣。例如:(1) 要養(yǎng)成良好的書(shū)寫(xiě)程序的習(xí)慣。也正是這個(gè)原因,我獨(dú)立思考、獨(dú)立工作以及應(yīng)用所學(xué)知識(shí)分析和解決實(shí)際問(wèn)題的能力有了很大的提高。(4) 在客戶端系統(tǒng),功能的設(shè)置有待進(jìn)一步豐富,功能的實(shí)現(xiàn)還有待完善和改進(jìn)。(2) 對(duì)發(fā)送的數(shù)據(jù),進(jìn)行一定的加密措施,使之更加安全可靠。而且,由于時(shí)間關(guān)系,客戶端的功能還不完全。到目前為止,我對(duì)服務(wù)器端還只進(jìn)行了初步的開(kāi)發(fā),而對(duì)客戶端的設(shè)計(jì)有很多都需要完善。 ,在本機(jī)及局域網(wǎng)中運(yùn)行正常 ,基本滿足聊天需要。在調(diào)試程序的時(shí)候,遇到了很多問(wèn)題。本文主要做了以下工作:(1) 列舉了即時(shí)通訊軟件的系統(tǒng)和界面需求。但是由于畢業(yè)設(shè)計(jì)時(shí)間較短,所以該系統(tǒng)還有許多不盡人意的地方,用戶界面不夠美觀等多方面問(wèn)題,都有待進(jìn)一步改善。其功能基本符合用戶需求,能夠完成即時(shí)通訊軟件的各項(xiàng)功能。 | amp。 | amp。發(fā)送登陸時(shí)的用戶名和密碼 02| amp。標(biāo)志下一次連接是重新連接 End IfEnd SubIf form3flag Then 39。自動(dòng)重連 = 1 39。如果服務(wù)器單方面斷開(kāi)了連接,客戶端還可以自動(dòng)重連。服務(wù)器代碼如下:Winsock1(0).LocalPort = 1987Winsock1(0).Listen’監(jiān)聽(tīng)客戶端代碼如下: ==1987系統(tǒng)設(shè)計(jì)之初 ,采用了由客戶關(guān)閉連接的辦法 ,但此時(shí)就出現(xiàn)了同一客戶再次連接不上服務(wù)器的錯(cuò)誤。代碼結(jié)構(gòu)如下:Private Sub WskclientDataArrival(ByVal bytesTotal AsLong)’消息到達(dá)時(shí)接收Dim ClientData As StringDim tou As Integer 39。服務(wù)器可以把系統(tǒng)管理員發(fā)的消息及其它客戶登錄、退出、對(duì)話的信息分別傳遞給傳給客戶端。客戶端:發(fā)送連接,是靠服務(wù)器回復(fù)的標(biāo)志變量,來(lái)判別連接狀態(tài)的。接收 ReDim Preserve nowconnext(maxconnext + 1) nowconnext(maxconnext) = True End IfEnd IfEnd Sub因?yàn)榭蛻舳税l(fā)送的每一個(gè)請(qǐng)求,都有個(gè)頭命令,服務(wù)器端根據(jù)這個(gè)頭命令來(lái)分辨客戶端的請(qǐng)求類型。當(dāng)前接收端口增加 Load Winsock1(maxconnext) 39。Winsock(i)被占用 Else 39。使用現(xiàn)成的Socket Winsock1(I).Accept requestID 39。在以前的Winsock中找到空閑的Winsock I = I + 1 DoEvents Wend If I = maxconnext Then 39。Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)On Error Resume NextDim I As LongIf Index = 0 Then 39。注冊(cè)窗口和個(gè)人信息窗口的界面如圖617和圖618: 注冊(cè)窗口 底層通訊設(shè)計(jì)服務(wù)器端:為了使能及時(shí)響應(yīng)多個(gè)用戶的請(qǐng)求,我對(duì)winsock控件添加了數(shù)組,也就是說(shuō),在連接上一個(gè)用戶后,自動(dòng)增加一個(gè)winsock控件進(jìn)行偵聽(tīng)。 vbCrLfForm_LoadEnd Sub點(diǎn)擊登陸后會(huì)顯示以下登陸窗口,用戶ID六位數(shù)后自動(dòng)轉(zhuǎn)到密碼欄,回車即完成登陸操作。 Text2 Text2 = End IfEnd SubPrivate Sub geren_Click()formactive = False = idIf sckConnected Then (0) = False (2) = False = 1Else 04| amp。 Mid(( 1), 1, 3) amp。slIf = True Then = TrueEnd IfEnd SubPrivate Sub sendmsg_click() If sckConnected Then MsgBox 你還沒(méi)登陸!, vbOKOnly + 64, 提示 ein_Click Exit Sub End If If Then 03| amp。 Left(Right(, 7), 6) = True (1) = False (2) = False = FalseEnd IfEnd SubPrivate Sub Option1_Click() 39。右邊列表顯示在線名單,雙擊列表可以顯示個(gè)人資料,由群聊轉(zhuǎn)為私聊后,可以選擇選定的目標(biāo)進(jìn)行一對(duì)一的悄悄話。 vbCrLf: 發(fā)放通知界面圖 客戶界面客戶機(jī)用Winsock控件發(fā)出信息,服務(wù)器端通過(guò)信息頭的標(biāo)識(shí)分辨客戶端的要求,比如登陸、注冊(cè)、注銷、發(fā)送信息,另外客戶端還有標(biāo)簽欄接收服務(wù)器發(fā)來(lái)的系統(tǒng)通告。 通知大家: amp。 amp。SaveSetting 即時(shí)通訊軟件服務(wù)器, tongz, tongz, tongzFor I = 1 To maxconnext If Winsock1(I).State = sckConnected Then Winsock1(I).SendData 12| amp。 vbCrLf amp。通知的內(nèi)容存放在tongz = GetSetting(即時(shí)通訊軟件服務(wù)器, tongz, tongz),其中tongz鍵值位置在HKEY_CURRENT_USER\Software\VB and VBA Program Settings\即時(shí)通訊軟件服務(wù)器\server。密碼驗(yàn)證時(shí)用到的部分代碼:na = GetSetting(即時(shí)通訊軟件服務(wù)器, server, name)pw = GetSetting(即時(shí)通訊軟件服務(wù)器, server, password)改新密碼時(shí)用到的部分代碼:SaveSetting 即時(shí)通訊軟件服務(wù)器, server, name, Text3SaveSetting 即時(shí)通訊軟件服務(wù)器, server, password, Text4管理員帳號(hào)和密碼都存在本機(jī)注冊(cè)表,初始賬戶和密碼都為空。 str DoEventsLoopClose 1If t = Then Text1 = 這一天沒(méi)有任何聊天信息 Else Text1 = tExit Sub30:Close 1Text1 = 這一天的聊天信息不存在,或文件已丟失End Sub在選擇日期的界面點(diǎn)擊任意的一天。 amp。 \data\ amp。 .txt For Input As 1Do Until EOF(1) Input 1, str t = t amp。 amp。選擇日期的界面在類模塊已經(jīng)定義了Dim Calendar As Class1關(guān)鍵代碼如下:Private Sub Command1_Click()c1 = Not c1If c1 Then Else End IfEnd SubPrivate Sub Command2_Click()On Error GoTo 30Dim t, str As Stringc1 = FalseOpen amp。 vbCrLf 保存記錄以及查看記錄對(duì)于保存的聊天和日志信息,服務(wù)器必須能夠很方便的顯示出任意一天的信息,實(shí)現(xiàn)快速查看。 CStr(maxconnext) amp。 人 amp。 vbCrLf = 當(dāng)前 amp。 (1).Text amp。 vbCrLf = (3).Text amp。 formtime amp。 (0).LocalIP amp。 \ CopyFile strSource, strDestination, False MsgBox 本地?cái)?shù)據(jù)庫(kù)已被成功恢復(fù)!, vbInformation + vbOKOnly, 系統(tǒng)提示 End If