【正文】
zxrs + 1 = amp。 說: amp。) /*已發(fā)送幀的計時器加1*/ { printf(不接收確認!\n)。 if(frame!=0) err=RECE(wr,frame,ack)。) { /*傳送處理*/ a=wsfront。 char end=39。 i。 /*接收窗口為空*/ else /*接收窗口接收幀號,并返回確認*/ { if(wrr[wrfront]==frame) { wrfront=(wrfront+1)%MAXSIZE。}int SEND(wsend *ws,wrece *wr,int frame){ if((wsrear+1)%MAXSIZE==wsfront)return 0。還有通過自己動手編寫程序,鍛煉了我的編程能力。 amp。若該用戶在線,則將發(fā)送用戶發(fā)送來的消息通過鏈接轉(zhuǎn)發(fā)到接收用戶的客戶端上,由客戶端顯示。 while(awsrear) { if(wss[a].timeout==6) { wss[a].timeout=1。n39。 return 1。 printf(第%d幀出接收窗口,向發(fā)送窗口返回確認。 /*發(fā)送窗口已滿*/ if(wsfront==wsrear) /*若窗口為空,則直接進入*/ { wss[wsrear].snum=frame。包括協(xié)議的各種策略,如包丟失、停等應答、超時等都應有所仿真實現(xiàn)。 顯示數(shù)據(jù)傳送過程中的各項具體數(shù)據(jù);雙方幀的個數(shù)變化,幀序號,發(fā)送和接受速度,暫?;蛑貍魈崾镜取? wss[wsrear].timeout=1。\n,frame)。 } else printf(無確認信息?。n)。,ch,ACK。 flag=1。如果發(fā)送用戶發(fā)送的消息是對所有人的,則將該消息轉(zhuǎn)發(fā)至所有人。 對 amp。第五部分:參考文獻(1) 吳功宜、吳英編著.《計算機網(wǎng)絡(luò)技術(shù)教程——自頂向下的分析與設(shè)計方法》.北京:機械工業(yè)出版社,2010(2) 謝希仁.《計算機網(wǎng)絡(luò)》(第4版).北京:電子工業(yè)出版社.(3) 劉韜,駱娟《Visual Basic 數(shù)據(jù)庫通用模塊及電信系統(tǒng)開發(fā)》。 /*發(fā)送窗口已滿*/ if(wsfront==wsrear) /*若窗口為空,則直接進入*/ { wss[wsrear].snum=frame。 printf(第%d幀出接收窗口,向發(fā)送窗口返回確認。 return 1。n39。 while(awsrear) { if(wss[a].timeout==6) { wss[a].timeout=1。 if(err==0)printf(接收窗口已空,沒有接受的幀!\n)。 a=wsfront。 S Call AddToText1(S) End Sub Private Sub Form_Load() ReDim userState(MaxChan) ReDim user(MaxChan) ReDim userIP(MaxChan) Dim i As Integer Hig = 24 zxrs = 0 For i = 1 To MaxChan 1 Load sckServer(i) Next i = 1000 所有人 = 0 End SubPrivate Sub HScroll1_Change() = 50 * 10End SubPrivate Sub List1_Click() MsgBox sckServer(FindSckIndex(())).RemoteHostIP amp。 zxrs amp。State0 非正常終止 Dim S As String sckServer(index).Close If userState(index) 0 Then zxrs = zxrs 1 39。設(shè)置用戶狀態(tài)為離線 Call AddToText1(S) End IfEnd Sub:模塊Public MaxChan As Integer 客戶端:登錄窗體Dim fso As New FileSystemObjectDim fil As FilePrivate Sub Command1_Click() ServerIP = ReadServerIP() userName = Trim() If userName = Then MsgBox 姓名不能為空! Exit Sub End If Load frmClient = FalseEnd SubPrivate Sub Form_Load() Dim filepath As String sysfilepath = (1)If (sysfilepath amp。 recUser amp。 Chr(10)End SubPrivate Sub Timer1_Timer()If connecting_Time connect_OutTime Then connecting_Time = connecting_Time + 1 Exit Sub End If If = 7 Then = False Exit Sub Else Unload Me MsgBox 連接服務(wù)器失敗!, 0 + 16 + 0, 聊天室客戶端 = True End IfEnd SubPrivate Sub VScroll1_Change()ChangHeight = Hig = + ChangHeight * (4560 / 19)Hig = End Sub:模塊Public userName As StringPublic Msgnum As IntegerPublic ServerIP As StringPublic connecting_Time As IntegerPublic connect_OutTime As IntegerPublic Function ReadServerIP(filename As String) As String Dim ss As String cs = ss = Open filename For Input As 1 Line Input 1, ss Close 1 ReadServerIP = Mid(ss, 2, Len(ss) 2)End Function。 DoEvents End If = Else = MsgBox 很抱歉,你被管理員禁言! End If End SubPrivate Sub cmdCls_Click() = = 4680 = 50 = 19 = 19 Hig = 19 con = 0End SubPrivate Sub cmdExit_Click() Unload MeEnd SubPrivate Sub Command1_Click() End Sub Private Sub Form_Load() = userName Hig = 19 39。 \) MsgBox (!) Else MsgBox (,安裝失敗!) End IfEnd IfEnd SubPrivate Sub Image1_Click()End SubPrivate Sub SetIP_Click() End Sub:服務(wù)器IP設(shè)置窗體Private Sub cmdOK_Click() WriteServerIP () Unload MeEnd SubPrivate Sub Command1_Click()Unload MeEnd SubPrivate Function WriteServerIP(filename As String) As String Dim ss As String Open filename For Output As 1 Write 1, Close 1 End FunctionPrivate Sub Form_Load() = ReadServerIP()End Sub:客戶端聊天室窗體Dim n As IntegerDim Hig As LongDim con As IntegerPrivate Sub ConnectServer()On Error GoTo ErrorPro Exit SubErrorPro: MsgBox 服務(wù)器未開或網(wǎng)絡(luò)出錯! EndEnd Sub Private Sub cmdSend_Click() Dim recUser As String If n 1 Then recUser = If 所有人 Then recUser = amp。 zxrs amp。 user(index) amp。 sckServer(FindSckIndex(())).RemotePort End Sub Private Sub sckBusy_Close() End Sub Private Sub sckBusy_DataArrival(ByVal bytesTotal As Long) SystemOrder:服務(wù)器忙,請稍后再連接! DoEvents End Sub Private Sub sckListen_ConnectionRequest(ByVal requestID As Long) Dim i As Integer 39。 a++。 /*幀確認處理*/ printf(是否進行確認?(y/n):)。 printf(重發(fā)第%d幀\n,wss[a])。 int ack[5]。}void PRINT(wsend *ws,wrece *wr){ int a,b。 ack[i]=frame。 wsrear=(wsrear+1)%MAXSIZE。 /*全局變量,代表當前指向確認表的位置*/typedef struct /*發(fā)送窗口每幀的數(shù)據(jù)*/{ int snum。 說: amp。禁止發(fā)言通過對其鏈接的屏蔽,踢出用戶則是由服務(wù)端斷開其鏈接,從而達到踢出某用戶的目的。 } else wss[a].timeout++。