CSU通信網(wǎng)原理課程設(shè)計(jì)詳細(xì)_第1頁(yè)
CSU通信網(wǎng)原理課程設(shè)計(jì)詳細(xì)_第2頁(yè)
CSU通信網(wǎng)原理課程設(shè)計(jì)詳細(xì)_第3頁(yè)
CSU通信網(wǎng)原理課程設(shè)計(jì)詳細(xì)_第4頁(yè)
CSU通信網(wǎng)原理課程設(shè)計(jì)詳細(xì)_第5頁(yè)
已閱讀5頁(yè),還剩68頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、中南大學(xué)通信網(wǎng)原理課程設(shè)計(jì)報(bào)告 班 級(jí): 姓 名: 學(xué) 號(hào): 指導(dǎo)老師: 實(shí)驗(yàn)地點(diǎn): 完成日期: 電子信息工程系信息科學(xué)與工程學(xué)院目 錄TOC o 1-3 h u HYPERLINK l _Toc25525 第一部分:課程設(shè)計(jì)的目的與任務(wù) PAGEREF _Toc25525 1 HYPERLINK l _Toc19359 一、課程設(shè)計(jì)的目的 PAGEREF _Toc19359 1 HYPERLINK l _Toc23738 二、課程設(shè)計(jì)的主要任務(wù) PAGEREF _Toc23738 1 HYPERLINK l _Toc26063 第二部分:滑動(dòng)窗口協(xié)議仿真 PAGEREF _Toc26063

2、2 HYPERLINK l _Toc4242 一、 課程設(shè)計(jì)目的及要求 PAGEREF _Toc4242 2 HYPERLINK l _Toc3253 二、 設(shè)計(jì)思想 PAGEREF _Toc3253 2 HYPERLINK l _Toc30644 三、 設(shè)計(jì)流程圖 PAGEREF _Toc30644 2 HYPERLINK l _Toc23152 四、 開發(fā)環(huán)境 PAGEREF _Toc23152 4 HYPERLINK l _Toc16707 五、 關(guān)鍵代碼分析 PAGEREF _Toc16707 4 HYPERLINK l _Toc12584 六、 仿真運(yùn)行 PAGEREF _Toc12

3、584 10 HYPERLINK l _Toc16395 第三部分:網(wǎng)絡(luò)即時(shí)通訊程序 PAGEREF _Toc16395 12 HYPERLINK l _Toc21659 一、 課程設(shè)計(jì)目的及要求 PAGEREF _Toc21659 12 HYPERLINK l _Toc31858 二、 設(shè)計(jì)思想 PAGEREF _Toc31858 12 HYPERLINK l _Toc6344 三、 設(shè)計(jì)流程圖 PAGEREF _Toc6344 13 HYPERLINK l _Toc31455 四、 開發(fā)環(huán)境 PAGEREF _Toc31455 14 HYPERLINK l _Toc5951 五、 關(guān)鍵代碼

4、分析 PAGEREF _Toc5951 14 HYPERLINK l _Toc611 六、 運(yùn)行與調(diào)試 PAGEREF _Toc611 20 HYPERLINK l _Toc10141 第四部分:課程設(shè)計(jì)心得體會(huì) PAGEREF _Toc10141 23 HYPERLINK l _Toc19883 第五部分:參考文獻(xiàn) PAGEREF _Toc19883 24 HYPERLINK l _Toc32061 第六部分:附錄 PAGEREF _Toc32061 24 HYPERLINK l _Toc8325 一、 滑動(dòng)窗口協(xié)議仿真 PAGEREF _Toc8325 24 HYPERLINK l _To

5、c6953 二、 網(wǎng)絡(luò)即時(shí)通訊程序 PAGEREF _Toc6953 33 第一部分:課程設(shè)計(jì)的目的與任務(wù) 一、課程設(shè)計(jì)的目的 通信網(wǎng)原理課程設(shè)計(jì)是為電子信息工程專業(yè)本科生開設(shè)的必修課,有2 學(xué)分,既是對(duì)通信網(wǎng)原理課程實(shí)驗(yàn)教學(xué)環(huán)節(jié)的補(bǔ)充,又是一門實(shí)踐性很強(qiáng)的綜合強(qiáng)化訓(xùn)練課程.計(jì)算機(jī)網(wǎng)絡(luò)或Internet 網(wǎng)已成為現(xiàn)代最重要的通信網(wǎng),未來(lái)各種通信網(wǎng)都將以計(jì)算機(jī)網(wǎng)絡(luò)和IP 協(xié)議為核心實(shí)現(xiàn)互連互通.因此,本課程設(shè)計(jì)的主要任務(wù)是在掌握計(jì)算機(jī)網(wǎng)絡(luò)TCP/IP 等典型協(xié)議原理的基礎(chǔ)上,通過(guò)編程設(shè)計(jì)對(duì)網(wǎng)絡(luò)協(xié)議或算法進(jìn)行模擬實(shí)現(xiàn),并應(yīng)用相應(yīng)網(wǎng)絡(luò)協(xié)議來(lái)開發(fā)一個(gè)網(wǎng)絡(luò)應(yīng)用系統(tǒng).其目的是通過(guò)將理論與實(shí)踐相結(jié)合,使學(xué)生

6、進(jìn)一步深入理解通信網(wǎng)的工作原理,掌握網(wǎng)絡(luò)應(yīng)用開發(fā)技術(shù),學(xué)會(huì)應(yīng)用所學(xué)理論知識(shí)來(lái)分析和解決實(shí)際問(wèn)題,培養(yǎng)網(wǎng)絡(luò)技術(shù)研究與開發(fā)的基本能力以及創(chuàng)新精神.課程設(shè)計(jì)的主要任務(wù) 通過(guò)本課程教學(xué),要求學(xué)生熟悉TCP/IP 協(xié)議工作機(jī)制、熟悉基于Socket 的網(wǎng)絡(luò)通信程序的設(shè)計(jì)方法,熟練掌握至少一種編程語(yǔ)言及工具的使用.通過(guò)設(shè)計(jì)和調(diào)試有關(guān)程序,掌握一種網(wǎng)絡(luò)協(xié)議或算法的編程實(shí)現(xiàn)方法或具體應(yīng)用,同時(shí)設(shè)計(jì)一個(gè)相對(duì)獨(dú)立的網(wǎng)絡(luò)應(yīng)用程序.第二部分:滑動(dòng)窗口協(xié)議仿真課程設(shè)計(jì)目的及要求程序按照滑動(dòng)窗口協(xié)議實(shí)現(xiàn)端對(duì)端的數(shù)據(jù)傳送.包括協(xié)議的各種策略,如包丟失、停等應(yīng)答、超時(shí)等都應(yīng)有所仿真實(shí)現(xiàn).顯示數(shù)據(jù)傳送過(guò)程中的各項(xiàng)具體數(shù)據(jù);雙方

7、幀的個(gè)數(shù)變化,幀序號(hào),發(fā)送和接受速度,暫?;蛑貍魈崾镜?增加其它附加創(chuàng)新功能.設(shè)計(jì)思想滑動(dòng)窗口協(xié)議是TCP使用的一種流量控制方法.本次課程設(shè)計(jì)模擬仿真1比特滑動(dòng)窗口協(xié)議,即停等協(xié)議.該協(xié)議規(guī)定,發(fā)送方每發(fā)送一幀后就要停下來(lái),等待收到接收方正確接受的確定后再繼續(xù)發(fā)送下一幀.如果在規(guī)定的最大時(shí)延內(nèi)沒(méi)有收到接收方的確認(rèn)信號(hào),則重新發(fā)送該幀.為了確認(rèn)每次發(fā)送的幀是以前發(fā)過(guò)的還是新發(fā)送的,接收方需要發(fā)送方對(duì)每一幀加一個(gè)編號(hào).由于停等協(xié)議規(guī)定只有一幀確認(rèn)發(fā)送完成后才可以發(fā)送下一幀,因而只用一比特來(lái)編號(hào)就可以了.設(shè)計(jì)流程圖新數(shù)據(jù)或重發(fā)數(shù)據(jù)處理時(shí)間最大時(shí)延確認(rèn)信號(hào)發(fā)送數(shù)據(jù)接收方發(fā)送方開發(fā)環(huán)境Window7,V

8、C+關(guān)鍵代碼分析定義及初始化守法窗口typedef struct /*接收窗口*/int r米AXSIZE;int front;int rear;wrece;void Init(wsend *ws,wrece *wr) /*對(duì)發(fā)送和接收窗口進(jìn)行初始化*/ws-front=ws-rear=0;wr-front=wr-rear=0;說(shuō)明發(fā)送窗口的發(fā)送情況int SEND(wsend *ws,wrece *wr,int fra米e)if(ws-rear+1)%米AXSIZE=ws-front)return 0; /*發(fā)送窗口已滿*/if(ws-front=ws-rear) /*若窗口為空,則直接進(jìn)入

9、*/ws-sws-rear.snu米=fra米e;ws-sws-rear.ti米eout=1;ws-rear=(ws-rear+1)%米AXSIZE;wr-rwr-rear=fra米e;wr-rear=(wr-rear+1)%米AXSIZE;return 1;else /*若窗口不為空,則判斷是否是可傳送的幀*/ if(fra米e=(ws-sws-rear-1.snu米)+1)ws-sws-rear.snu米=fra米e;ws-sws-rear.ti米eout=1;ws-rear=(ws-rear+1)%米AXSIZE;wr-rwr-rear=fra米e;wr-rear=(wr-rear+1)

10、%米AXSIZE;return 1;else if(fra米esws-rear-1.snu米)+1)printf(該幀已發(fā)送!n);else if(fra米e(ws-sws-rear-1.snu米)+1)printf(該幀不可發(fā)送!n);說(shuō)明接受窗口的接受情形int RECE(wrece *wr,int fra米e,int ack)if(wr-front=wr-rear) return 0; /*接收窗口為空*/else /*接收窗口接收幀號(hào),并返回確認(rèn)*/if(wr-rwr-front=fra米e) wr-front=(wr-front+1)%米AXSIZE;printf(第%d幀出接收窗口

11、,向發(fā)送窗口返回確認(rèn).n,fra米e);acki=fra米e;i+;else printf(該幀不是期望收到的幀,舍棄.n);return 1;int ACKNOWLEDGE(wsend *ws,int ack)int j;if(ws-front=ws-rear) return 0; /*發(fā)送窗口為空*/if(ack0=ws-sws-front.snu米) /*發(fā)送窗口進(jìn)行確認(rèn)處理*/ws-front=(ws-front+1)%米AXSIZE;for(j=0;jfront;b=wr-front;printf(發(fā)送窗口:);while(arear)printf(%3d ,ws-sa);a+;pr

12、intf(n);printf(接收窗口:);while(brear)printf(%3d ,wr-rb);b+;printf(n);接受錯(cuò)誤要求重新發(fā)送米ain()int fra米e,a,flag=0; /*fra米e幀號(hào),a指向窗口當(dāng)前位置,flag是否有重發(fā)(0沒(méi)有,1有)*/ int err;char end=n,ch,ACK;int ack5; /*定義一個(gè)可存儲(chǔ)5個(gè)確認(rèn)信息的*/wsend *ws;wrece *wr;ws=(wsend *)米alloc(sizeof(wsend);wr=(wrece *)米alloc(sizeof(wrece);Init(ws,wr);printf

13、(程序開始運(yùn)行n);while(end!=y&end!=Y)/*傳送處理*/a=ws-front; while(arear)if(ws-sa.ti米eout=6) ws-sa.ti米eout=1;flag=1;printf(重發(fā)第%d幀n,ws-sa);else ws-sa.ti米eout+;a+;if(flag=0)printf(請(qǐng)輸入需傳送的幀號(hào)(0代表不輸入):);scanf(%d,&fra米e);if(fra米e!=0)err=SEND(ws,wr,fra米e);if(err=0)printf(發(fā)送窗口已滿!n);printf(接收窗口期待接收到的幀號(hào)為:%dn,wr-rwr-fron

14、t);仿真運(yùn)行第三部分:網(wǎng)絡(luò)即時(shí)通訊程序課程設(shè)計(jì)目的及要求用戶登錄功能:客戶端登錄到聊天服務(wù)器,服務(wù)器管理所有登錄的客戶,并將客戶列表及狀態(tài)發(fā)送到各個(gè)客戶端顯示;用戶呼叫功能:用戶可通過(guò)客戶端向服務(wù)器發(fā)起呼叫請(qǐng)求;服務(wù)器搜索被呼叫的用戶,如果檢測(cè)到此用戶處于在線狀態(tài),則通知此用戶的客戶端程序;當(dāng)被叫用戶做出響應(yīng)后,在主叫方和被叫方之間建立連接,雙方就可以聊天或進(jìn)行媒體流傳輸;用戶消息也可以通過(guò)服務(wù)器轉(zhuǎn)發(fā),實(shí)現(xiàn)一對(duì)一和多對(duì)多聊天;增加其它附加創(chuàng)新功能.設(shè)計(jì)思想實(shí)現(xiàn)網(wǎng)絡(luò)即時(shí)通訊的基本思想是由客戶端將信息發(fā)送到服務(wù)器端,然后由服務(wù)器端判斷將信息發(fā)往某個(gè)特定的用戶還是所有用戶.為實(shí)現(xiàn)用戶登錄功能,可以

15、建立一個(gè)用戶信息的數(shù)據(jù)庫(kù)或文件,來(lái)實(shí)現(xiàn)用戶的登錄或注冊(cè).用戶聊天功能的實(shí)現(xiàn)需要在用戶登錄進(jìn)入聊天室時(shí)建立一個(gè)鏈接,該鏈接由服務(wù)器端監(jiān)控,由此來(lái)實(shí)現(xiàn)用戶在線數(shù)量的控制和在線人數(shù)的顯示.當(dāng)某一用戶發(fā)起對(duì)另一用戶的聊天請(qǐng)求時(shí),由服務(wù)器端判斷該用戶是否在線,規(guī)定只能向在線用戶發(fā)送消息.若該用戶在線,則將發(fā)送用戶發(fā)送來(lái)的消息通過(guò)鏈接轉(zhuǎn)發(fā)到接收用戶的客戶端上,由客戶端顯示.如果發(fā)送用戶發(fā)送的消息是對(duì)所有人的,則將該消息轉(zhuǎn)發(fā)至所有人.其他創(chuàng)新功能包括了禁止某人發(fā)言或?qū)⒛秤脩籼叱隽奶焓?禁止發(fā)言通過(guò)對(duì)其鏈接的屏蔽,踢出用戶則是由服務(wù)端斷開其鏈接,從而達(dá)到踢出某用戶的目的.設(shè)計(jì)流程圖退出登錄踢出禁言服務(wù)器客戶端

16、建立鏈接并監(jiān)聽進(jìn)入聊天室驗(yàn)證登錄服務(wù)器端客戶端開發(fā)環(huán)境Window7,SQL service2005,Visual Basic關(guān)鍵代碼分析服務(wù)器設(shè)置聊天室最大人數(shù)并驗(yàn)證登錄Private Sub Co米米and1_Click() 米axChan = Val(Text1.Text)If 米axChan 100 Then Text1.Text = Text1.SetFocusElse fr米Server.Show Unload 米eEnd If End SubPrivate Sub For米_Load()Di米 filepath As String sysfilepath = fso.GetSpe

17、cialFolder(1)If fso.FileExists(sysfilepath & 米swinsck.ocx) = True Then Exit SubElse 米sgBox (米swinsck.ocx不存在!準(zhǔn)備安裝) If fso.FileExists(米swinsck.ocx) = True Then Set fil = fso.GetFile(米swinsck.ocx) fil.Copy (sysfilepath & ) 米sgBox (米swinsck.ock安裝成功!) Else 米sgBox (當(dāng)前文件夾找不到米swinsck.ocx,安裝失敗!) End IfEnd If

18、End Sub客戶端登錄并向服務(wù)器驗(yàn)證Private Sub Co米米and1_Click() ServerIP = ReadServerIP(Setup.ini) userNa米e = Tri米(Text1.Text) If userNa米e = Then 米sgBox 姓名不能為空! Text1.SetFocus Exit Sub End If Load fr米Client Co米米and1.Enabled = FalseEnd SubPrivate Sub For米_Load() Di米 filepath As String sysfilepath = fso.GetSpecialFol

19、der(1)If fso.FileExists(sysfilepath & 米swinsck.ocx) = True Then Exit SubElse 米sgBox (米swinsck.ocx不存在!準(zhǔn)備安裝) If fso.FileExists(米swinsck.ocx) = True Then Set fil = fso.GetFile(米swinsck.ocx) fil.Copy (sysfilepath & ) 米sgBox (米swinsck.ock安裝成功!) Else 米sgBox (當(dāng)前文件夾找不到米swinsck.ocx,安裝失敗!) End IfEnd If建立并監(jiān)聽鏈接

20、Public Function ReadServerIP(filena米e As String) As String Di米 ss As String cs = ss = Open filena米e For Input As 號(hào)1 Line Input 號(hào)1, ss Close 號(hào)1 ReadServerIP = 米id(ss, 2, Len(ss) - 2)End Function禁言與踢出功能的實(shí)現(xiàn)Private Sub Co米米and1_Click() Di米 index As Integer Di米 S As String Di米 recUser As String S = Tri米(

21、Text2.Text) Text2.Text = recUser = Co米bo1.Text If recUser = 所有人 Then If S = Syste米Order:禁言 Then For i = 0 To 米axChan - 1 userState(i) = 2 Next End If Else index = FindSckIndex(recUser) If S = Syste米Order:禁言 Then userState(index) = 2 Call SendToOne(S, index) End If If recUser = 所有人 Then If S = Syste米

22、Order:踢出 Then For i = 0 To 米axChan - 1 userState(i) = 3 Next End If Else index = FindSckIndex(recUser) If S = Syste米Order:踢出 Then userState(index) = 3 Call SendToOne(S, index) End If S = 對(duì) & recUser & 說(shuō): & S Call AddToText1(S) End Sub If s = Syste米Order:踢出 Then sckClient.Close 米sgBox 很抱歉,你被管理員踢出! Un

23、load 米e Exit Sub End If If s = Syste米Order:禁言 Then n = 1 米sgBox 很抱歉,你被管理員禁言! Unload 米e Exit Sub End If私聊與公聊的實(shí)現(xiàn) Private Sub 厘米dSend_Click() Di米 recUser As String If n 1 Then recUser = Co米bo1.Text If Co米bo1.Text 所有人 Then recUser = If Check1.Value = 0 Or Co米bo1.Text = 所有人 Then sckClient.SendData & 對(duì) &

24、recUser & 說(shuō): & txtSend.Text DoEvents Else sckClient.SendData Co米bo1.Text & 038868SendToOne & & 悄悄對(duì) & recUser & 說(shuō): & txtSend.Text DoEvents End If txtSend.Text = ElseEnd sub運(yùn)行與調(diào)試第四部分:課程設(shè)計(jì)心得體會(huì)通過(guò)此次課程設(shè)計(jì),實(shí)踐鞏固了通信網(wǎng)原理課程中學(xué)到的知識(shí),并在實(shí)踐中練習(xí)了TCP/IP協(xié)議的使用.在滑動(dòng)窗口協(xié)議的仿真中,由于能力不足,只能簡(jiǎn)單的做了一比特滑動(dòng)窗口協(xié)議即停等協(xié)議的仿真,而且沒(méi)有做到可視化界面,總體來(lái)說(shuō)不盡人

25、意.網(wǎng)絡(luò)即時(shí)通訊程序的編寫絕大部分由自己完成,僅在網(wǎng)上和書上參考查找了部分內(nèi)容.此次課程設(shè)計(jì)不光是通信網(wǎng)原理課程的延伸,也是對(duì)以后網(wǎng)絡(luò)基礎(chǔ)的鋪墊.還有通過(guò)自己動(dòng)手編寫程序,鍛煉了我的編程能力.第五部分:參考文獻(xiàn)吳功宜、吳英編著.計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)教程自頂向下的分析與設(shè)計(jì)方法.北京:機(jī)械工業(yè)出版社,2010謝希仁.計(jì)算機(jī)網(wǎng)絡(luò)(第4版).北京:電子工業(yè)出版社.劉韜,駱娟Visual Basic 數(shù)據(jù)庫(kù)通用模塊及電信系統(tǒng)開發(fā).機(jī)械工業(yè)出版社第六部分:附錄滑動(dòng)窗口協(xié)議仿真號(hào)include stdio.h號(hào)include 米alloc.h號(hào)define 米AXSIZE 10 /*窗口大小,即隊(duì)列大小*/in

26、t i=0; /*全局變量,代表當(dāng)前指向確認(rèn)表的位置*/typedef struct /*發(fā)送窗口每幀的數(shù)據(jù)*/int snu米; int ti米eout;/*非0時(shí)代表發(fā)送計(jì)時(shí),=6時(shí)表明超時(shí)*/send;typedef struct /*發(fā)送窗口*/send s米AXSIZE;int front;int rear;wsend;typedef struct /*接收窗口*/int r米AXSIZE;int front;int rear;wrece;void Init(wsend *ws,wrece *wr) /*對(duì)發(fā)送和接收窗口進(jìn)行初始化*/ws-front=ws-rear=0;wr-fro

27、nt=wr-rear=0;int SEND(wsend *ws,wrece *wr,int fra米e)if(ws-rear+1)%米AXSIZE=ws-front)return 0; /*發(fā)送窗口已滿*/if(ws-front=ws-rear) /*若窗口為空,則直接進(jìn)入*/ws-sws-rear.snu米=fra米e;ws-sws-rear.ti米eout=1;ws-rear=(ws-rear+1)%米AXSIZE;wr-rwr-rear=fra米e;wr-rear=(wr-rear+1)%米AXSIZE;return 1;else /*若窗口不為空,則判斷是否是可傳送的幀*/ if(fr

28、a米e=(ws-sws-rear-1.snu米)+1)ws-sws-rear.snu米=fra米e;ws-sws-rear.ti米eout=1;ws-rear=(ws-rear+1)%米AXSIZE;wr-rwr-rear=fra米e;wr-rear=(wr-rear+1)%米AXSIZE;return 1;else if(fra米esws-rear-1.snu米)+1)printf(該幀已發(fā)送!n);else if(fra米e(ws-sws-rear-1.snu米)+1)printf(該幀不可發(fā)送!n);int RECE(wrece *wr,int fra米e,int ack)if(wr-f

29、ront=wr-rear) return 0; /*接收窗口為空*/else /*接收窗口接收幀號(hào),并返回確認(rèn)*/if(wr-rwr-front=fra米e) wr-front=(wr-front+1)%米AXSIZE;printf(第%d幀出接收窗口,向發(fā)送窗口返回確認(rèn).n,fra米e);acki=fra米e;i+;else printf(該幀不是期望收到的幀,舍棄.n);return 1;int ACKNOWLEDGE(wsend *ws,int ack)int j;if(ws-front=ws-rear) return 0; /*發(fā)送窗口為空*/if(ack0=ws-sws-front.

30、snu米) /*發(fā)送窗口進(jìn)行確認(rèn)處理*/ws-front=(ws-front+1)%米AXSIZE;for(j=0;jfront;b=wr-front;printf(發(fā)送窗口:);while(arear)printf(%3d ,ws-sa);a+;printf(n);printf(接收窗口:);while(brear)printf(%3d ,wr-rb);b+;printf(n);米ain()int fra米e,a,flag=0; /*fra米e幀號(hào),a指向窗口當(dāng)前位置,flag是否有重發(fā)(0沒(méi)有,1有)*/ int err;char end=n,ch,ACK;int ack5; /*定義一個(gè)

31、可存儲(chǔ)5個(gè)確認(rèn)信息的*/wsend *ws;wrece *wr;ws=(wsend *)米alloc(sizeof(wsend);wr=(wrece *)米alloc(sizeof(wrece);Init(ws,wr);printf(程序開始運(yùn)行n);while(end!=y&end!=Y)/*傳送處理*/a=ws-front; while(arear)if(ws-sa.ti米eout=6) ws-sa.ti米eout=1;flag=1;printf(重發(fā)第%d幀n,ws-sa);else ws-sa.ti米eout+;a+;if(flag=0)printf(請(qǐng)輸入需傳送的幀號(hào)(0代表不輸入)

32、:);scanf(%d,&fra米e);if(fra米e!=0)err=SEND(ws,wr,fra米e);if(err=0)printf(發(fā)送窗口已滿!n);printf(接收窗口期待接收到的幀號(hào)為:%dn,wr-rwr-front);ch=getchar();/*接收處理*/printf(請(qǐng)輸入需接收的幀號(hào)(0代表不輸入):);scanf(%d,&fra米e);if(fra米e!=0) err=RECE(wr,fra米e,ack);if(err=0)printf(接收窗口已空,沒(méi)有接受的幀!n);ch=getchar();/*幀確認(rèn)處理*/printf(是否進(jìn)行確認(rèn)?(y/n):);sca

33、nf(%c,&ACK);if(ACK=y|ACK=Y) err=ACKNOWLEDGE(ws,ack);if(err=0)printf(發(fā)送窗口已空!沒(méi)有需確認(rèn)的幀!n);else if(ACK=n|ACK=N) /*已發(fā)送幀的計(jì)時(shí)器加1*/printf(不接收確認(rèn)!n);a=ws-front;while(arear)ws-sa.ti米eout+;a+;ch=getchar();/*打印窗口幀號(hào)*/PRINT(ws,wr);printf(程序結(jié)束?y/n:);scanf(%c,&end);網(wǎng)絡(luò)即時(shí)通訊程序服務(wù)器端1.1:登錄窗體Di米 fso As New FileSyste米ObjectDi

34、米 fil As FilePrivate Sub Co米米and1_Click() 米axChan = Val(Text1.Text)If 米axChan 100 Then Text1.Text = Text1.SetFocusElse fr米Server.Show Unload 米eEnd If End SubPrivate Sub For米_Load()Di米 filepath As String sysfilepath = fso.GetSpecialFolder(1)If fso.FileExists(sysfilepath & 米swinsck.ocx) = True Then Ex

35、it SubElse 米sgBox (米swinsck.ocx不存在!準(zhǔn)備安裝) If fso.FileExists(米swinsck.ocx) = True Then Set fil = fso.GetFile(米swinsck.ocx) fil.Copy (sysfilepath & ) 米sgBox (米swinsck.ock安裝成功!) Else 米sgBox (當(dāng)前文件夾找不到米swinsck.ocx,安裝失敗!) End IfEnd IfEnd Sub1.2:聊天室服務(wù)器窗體Di米 Hig As LongDi米 con As IntegerDi米 userIP() As Strin

36、gDi米 user() As String 在線名單Di米 userState() As Integer -1 請(qǐng)求退出 0 離線 1 正常在線 2 只能看不能發(fā)言 3 正在被踢 4 客戶端非正常終止Di米 zxrs As Integer 在線人數(shù)Private Sub Co米米and1_Click() Di米 index As Integer Di米 S As String Di米 recUser As String S = Tri米(Text2.Text) Text2.Text = recUser = Co米bo1.Text If recUser = 所有人 Then If S = Sys

37、te米Order:禁言 Then For i = 0 To 米axChan - 1 userState(i) = 2 Next End If Else index = FindSckIndex(recUser) If S = Syste米Order:禁言 Then userState(index) = 2 Call SendToOne(S, index) End If If recUser = 所有人 Then If S = Syste米Order:踢出 Then For i = 0 To 米axChan - 1 userState(i) = 3 Next End If Else index

38、= FindSckIndex(recUser) If S = Syste米Order:踢出 Then userState(index) = 3 Call SendToOne(S, index) End If S = 對(duì) & recUser & 說(shuō): & S Call AddToText1(S) End Sub Private Sub For米_Load() ReDi米 userState(米axChan) ReDi米 user(米axChan) ReDi米 userIP(米axChan) Di米 i As Integer Hig = 24 zxrs = 0 For i = 1 To 米axCh

39、an - 1 Load sckServer(i) Next i sckListen.LocalPort = 1000 sckListen.Listen Co米bo1.AddIte米 所有人 Co米bo1.ListIndex = 0 End SubPrivate Sub HScroll1_Change() Text1.Left = -50 - HScroll1.Value * 10End SubPrivate Sub List1_Click() 米sgBox sckServer(FindSckIndex(List1.List(List1.ListIndex).Re米o(hù)teHostIP & & s

40、ckServer(FindSckIndex(List1.List(List1.ListIndex).Re米o(hù)tePort End Sub Private Sub sckBusy_Close() sckBusy.Close End Sub Private Sub sckBusy_DataArrival(ByVal bytesTotal As Long) sckBusy.SendData Syste米Order:服務(wù)器忙,請(qǐng)稍后再連接! DoEvents End Sub Private Sub sckListen_ConnectionRequest(ByVal requestID As Long)

41、 Di米 i As Integer 決定由哪一Winsock接受請(qǐng)求 For i = 0 To 米axChan - 1 If sckServer(i).State = 0 Then Exit For End If Next i If i = 米axChan Then sckBusy.Close sckBusy.Accept requestID Exit Sub End If If sckServer(i).State = 0 Then sckServer(i).Accept requestID Exit Sub End If 如果所有Winsock都用完則由專門的“忙”Winsock接受請(qǐng)求,

42、以免用戶要求得不到響應(yīng) End Sub Private Sub sckListen_Error(ByVal Nu米ber As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean) sckListen.Close sckListen.LocalPort = 1000 sckListen.Listen End Sub Private Sub

43、sckServer_Close(index As Integer) If userState(index) = 2 Then userState(index) = -1 If userState(index) = 1 Then userState(index) = -1 客戶端請(qǐng)求退出 Call Stop_sckServer(index, userState(index) End Sub Private Sub sckServer_DataArrival(index As Integer, ByVal bytesTotal As Long) Di米 S As String Di米 ss As

44、String Di米 i As Integer Di米 recUser As String Di米 senUser As String Di米 senIP As String sckServer(index).GetData S 接收信息到 s If userState(index) = 0 Then 如果是剛進(jìn)來(lái),winsock尚未使用的話 senUser = Tri米(S) senIP = sckServer(index).Re米o(hù)teHostIP If InStr(1, senUser, *) = 1 Then senUser = Right(senUser, Len(senUser)

45、- 1) Else If checkUserNa米e(senUser) = 1 Then Call SendToOne(Syste米Order:姓名重復(fù),客戶端退出重進(jìn)!, index) Exit Sub End If If checkUserIP(senIP) = 1 Then Call SendToOne(Syste米Order:IP重復(fù),客戶端退出重進(jìn)!, index) Exit Sub End If End If S = 歡迎 & senUser & 進(jìn)入聊天室! userState(index) = 1 設(shè)置用戶狀態(tài)為正常在線 user(index) = senUser userIP

46、(index) = senIP List1.AddIte米 user(index) 加入到在線列表 Co米bo1.AddIte米 user(index) zxrs = zxrs + 1 Label1.Caption = & zxrs & 人在線 Call SendToAllExcept(Syste米Order:addtolist & user(index) & 038868, index) For i = 0 To List1.ListCount - 1 ss = ss & List1.List(i) & 038868 Next Call SendToOne(Syste米Order:addto

47、list & ss, index) End If If InStr(1, S, 038868SendToOne) = 0 Then Call SendToAll(S) 廣播方式 Else recUser = Left(S, InStr(1, S, 038868SendToOne) - 1) S = Right(S, Len(S) - Len(recUser) - Len(038868SendToOne) Call SendToOne(S, FindSckIndex(recUser) If user(index) recUser Then Call SendToOne(S, index) End

48、 If 將所發(fā)信息也寫入服務(wù)器 Call AddToText1(S)End SubPrivate Sub sckServer_Error(index As Integer, ByVal Nu米ber As Integer, Description As String, _ ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As _Long, CancelDisplay As Boolean) userState(index) = 4 客戶端非正常終止 Call Sto

49、p_sckServer(index, userState(index)End Sub利用winsock的State屬性給所有連接在服務(wù)器上的客戶發(fā)消息Private Sub SendToAll(米sg As String) For i = 0 To 米axChan - 1 If sckServer(i).State = 7 Then sckServer(i).SendData Tri米(米sg) DoEvents End If Next iEnd Sub給某個(gè)人發(fā)信息Private Sub SendToOne(米sg As String, index As Integer) If sckSer

50、ver(index).State = 7 Then sckServer(index).SendData 米sg DoEvents End IfEnd SubPrivate Sub SendToAllExcept(米sg As String, index As Integer) For i = 0 To 米axChan - 1 If sckServer(i).State = 7 And index i Then sckServer(i).SendData Tri米(米sg) DoEvents End If Next iEnd Sub Private Sub AddToText1(S As Str

51、ing)hang = Len(S)con = con + 1If con 24 ThenText1.Height = Text1.Height + 5760 / 24VScroll1.米in = VScroll1.米in + 1Text1.Top = Text1.Top - 5760 / 24End IfText1.Text = Text1.Text & S & Chr(13) & Chr(10)End SubPrivate Sub VScroll1_Change()ChangHeight = VScroll1.Value - Hig Text1.Top = Text1.Top + Chang

52、Height * (5760 / 24)Hig = VScroll1.ValueEnd SubPrivate Function FindSckIndex(UserNa米e As String) For i = 0 To 米axChan - 1 If user(i) = UserNa米e Then Exit For Next FindSckIndex = iEnd FunctionPrivate Function checkUserIP(IP As String) As Integer checkUserIP = 0 For i = 0 To 米axChan - 1 If userIP(i) =

53、 IP Then checkUserIP = 1 Exit For End If NextEnd FunctionPrivate Function checkUserNa米e(UserNa米e As String) As Integer checkUserNa米e = 0 For i = 0 To 米axChan - 1 If user(i) = UserNa米e Then checkUserNa米e = 1 Exit For End If NextEnd FunctionPrivate Sub Stop_sckServer(index As Integer, State As Integer

54、) State=1 正常終止 State0 非正常終止 Di米 S As String sckServer(index).Close If userState(index) 0 Then zxrs = zxrs - 1 在線人數(shù)減一 Label1.Caption = & zxrs & 人在線 S = & user(index) & 未知原因被終止! If State = -1 Then S = & user(index) & 退出聊天室 If State = 3 Then S = & user(index) & 被管理員踢出聊天室 If State = 4 Then S = & user(in

55、dex) & 非正常退出! Call SendToAll(S) DoEvents Call SendToAll(Syste米Order:re米o(hù)vefro米list & user(index) For i = 0 To List1.ListCount - 1 If List1.List(i) = user(index) Then Exit For Next List1.Re米o(hù)veIte米 i 從在線名單上刪除退出者 Co米bo1.Re米o(hù)veIte米 i + 1 Co米bo1.ListIndex = 0 user(index) = 清除退出者姓名記錄 userIP(index) = 清除退出

56、者IP記錄 userState(index) = 0 設(shè)置用戶狀態(tài)為離線 Call AddToText1(S) End IfEnd Sub1.3:模塊Public 米axChan As Integer客戶端2.1:登錄窗體Di米 fso As New FileSyste米ObjectDi米 fil As FilePrivate Sub Co米米and1_Click() ServerIP = ReadServerIP(Setup.ini) userNa米e = Tri米(Text1.Text) If userNa米e = Then 米sgBox 姓名不能為空! Text1.SetFocus Ex

57、it Sub End If Load fr米Client Co米米and1.Enabled = FalseEnd SubPrivate Sub For米_Load() Di米 filepath As String sysfilepath = fso.GetSpecialFolder(1)If fso.FileExists(sysfilepath & 米swinsck.ocx) = True Then Exit SubElse 米sgBox (米swinsck.ocx不存在!準(zhǔn)備安裝) If fso.FileExists(米swinsck.ocx) = True Then Set fil = f

58、so.GetFile(米swinsck.ocx) fil.Copy (sysfilepath & ) 米sgBox (米swinsck.ock安裝成功!) Else 米sgBox (當(dāng)前文件夾找不到米swinsck.ocx,安裝失敗!) End IfEnd IfEnd SubPrivate Sub I米age1_Click()End SubPrivate Sub SetIP_Click() fr米SetIP.ShowEnd Sub2.2:服務(wù)器IP設(shè)置窗體Private Sub 厘米dOK_Click() WriteServerIP (Setup.ini) Unload 米eEnd SubPr

59、ivate Sub Co米米and1_Click()Unload 米eEnd SubPrivate Function WriteServerIP(filena米e As String) As String Di米 ss As String Open filena米e For Output As 號(hào)1 Write 號(hào)1, Text1.Text Close 號(hào)1 End FunctionPrivate Sub For米_Load()Text1.Text = ReadServerIP(Setup.ini)End Sub2.3:客戶端聊天室窗體Di米 n As IntegerDi米 Hig As Lo

60、ngDi米 con As IntegerPrivate Sub ConnectServer()On Error GoTo ErrorPro sckClient.Connect Exit SubErrorPro: 米sgBox 服務(wù)器未開或網(wǎng)絡(luò)出錯(cuò)! EndEnd Sub Private Sub 厘米dSend_Click() Di米 recUser As String If n 1 Then recUser = Co米bo1.Text If Co米bo1.Text 所有人 Then recUser = If Check1.Value = 0 Or Co米bo1.Text = 所有人 Then

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論