【正文】
MsgBox s Call GetUsersName(s) If = 7 Then = False Unload frmLogin Exit Sub End If If InStr(1, s, SystemOrder:removefromlist) = 1 Then Call RemoveFromlist(s) Exit Sub End If End If Call AddToText1(s) End Sub Private Sub sckClient_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean) Unload Me MsgBox 連接服務(wù)器失??!, 0 + 16 + 0, 聊天室客戶端 = True End SubPrivate Sub AddToList(ss As String) ss ss = amp。 說: amp。 被管理員踢出聊天室~~~~~~ If State = 4 Then S = ~~~~~~ amp。客戶端非正常終止 Call Stop_sckServer(index, userState(index))End Sub39。Call SendToOne(SystemOrder:IP重復(fù),客戶端退出重進!, index) 39。 \) = True Then Exit SubElse MsgBox (!準備安裝.....) If () = True Then Set fil = () (sysfilepath amp。) { err=ACKNOWLEDGE(ws,ack)。 if(err==0)printf(發(fā)送窗口已滿!\n)。 while(end!=39。 printf(接收窗口:)。 /*發(fā)送窗口為空*/ if(ack[0]==wss[wsfront].snum) /*發(fā)送窗口進行確認處理*/ { wsfront=(wsfront+1)%MAXSIZE。 wrr[wrrear]=frame。typedef struct /*接收窗口*/{ int r[MAXSIZE]。 recUser amp。 說: amp。 printf(接收窗口期待接收到的幀號為:%d\n,wrr[wrfront])。y39。 while(bwrrear) { printf(%3d ,wrr[b])。 for(j=0。 wrrear=(wrrear+1)%MAXSIZE。 int front。計算機網(wǎng)絡(luò)或Internet 網(wǎng)已成為現(xiàn)代最重要的通信網(wǎng),未來各種通信網(wǎng)都將以計算機網(wǎng)絡(luò)和IP 協(xié)議為核心實現(xiàn)互連互通。為了確認每次發(fā)送的幀是以前發(fā)過的還是新發(fā)送的,接收方需要發(fā)送方對每一幀加一個編號。 wss[wsrear].timeout=1。 }}int ACKNOWLEDGE(wsend *ws,int ack[]){ int j。 a++。 Init(ws,wr)。frame)。 \) = True Then Exit SubElse MsgBox (!準備安裝.....) If () = True Then Set fil = () (sysfilepath amp。 userName amp。 int front。 } else /*若窗口不為空,則判斷是否是可傳送的幀*/ { if(frame==(wss[wsrear1].snum)+1) { wss[wsrear].snum=frame。 return 1。 while(awsrear) { printf(%3d ,wss[a])。 wr=(wrece *)malloc(sizeof(wrece))。 scanf(%d,amp。y39。 scanf(%c,amp。接收信息到 s If userState(index) = 0 Then 39。 ss, index) End If If InStr(1, S, 038868SendToOne) = 0 Then Call SendToAll(S) 39。 user(index) amp。 amp。 連接超時時限為3秒 = ServerIP = 1000 Call ConnectServer 所有人 = 0 End SubPrivate Sub Form_Unload(Cancel As Integer) End SubPrivate Sub HScroll1_Change() = 50 * 10End Sub Private Sub sckClient_Close() MsgBox 服務(wù)器通道已關(guān)閉!, 0 + 16 + 0, 聊天室客戶端 End End Sub Private Sub sckClient_Connect() userName If InStr(1, userName, *) = 1 Then userName = Right(userName, Len(userName) 1) End If End Sub Private Sub sckClient_DataArrival(ByVal bytesTotal As Long) Dim s As String Msgnum = Msgnum + 1 s 39。 amp。 amp。 user(index)) For i = 0 To 1 If (i) = user(index) Then Exit For Next i 39。 S amp。 senUser amp。1 請求退出 0 離線 1 正常在線 2 只能看不能發(fā)言 3 正在被踢 4 客戶端非正常終止Dim zxrs As Integer 39。n39。 /*接收處理*/ printf(請輸入需接收的幀號(0代表不輸入):)。amp。 } printf(\n)。j++) ack[j]=ack[j+1]。 } else if(frame(wss[wsrear1].snum)+1)printf(該幀已發(fā)送!!\n)。}wrece。在滑動窗口協(xié)議的仿真中,由于能力不足,只能簡單的做了一比特滑動窗口協(xié)議即停等協(xié)議的仿真,而且沒有做到可視化界面,總體來說不盡人意。 recUser amp。為實現(xiàn)用戶登錄功能,可以建立一個用戶信息的數(shù)據(jù)庫或文件,來實現(xiàn)用戶的登錄或注冊。end!=39。} 接受錯誤要求重新發(fā)送main(){ int frame,a,flag=0。 printf(發(fā)送窗口收到確認,窗口向后移動。 else if(frame(wss[wsrear1].snum)+1)printf(該幀不可發(fā)送??!\n)。void Init(wsend *ws,wrece *wr) /*對發(fā)送和接收窗口進行初始化*/{ wsfront=wsrear=0。 課程設(shè)計的主要任務(wù) 通過本課程教學(xué),要求學(xué)生熟悉TCP/IP 協(xié)議工作機制、熟悉基于Socket 的網(wǎng)絡(luò)通信程序的設(shè)計方法,熟練掌握至少一種編程語言及工具的使用。本次課程設(shè)計模擬仿真1比特滑動窗口協(xié)議,即停等協(xié)議。 wrrear=(wrrear+1)%MAXSIZE。 } else printf(該幀不是期望收到的幀,舍棄。 b=wrfront。 wrece *wr。 a++。 設(shè)計流程圖退出登錄踢出禁言服務(wù)器客戶端建立鏈接并監(jiān)聽進入聊天室驗證登錄服務(wù)器端客戶端 開發(fā)環(huán)境Window7,SQL service2005,Visual Basic 關(guān)鍵代碼分析 服務(wù)器設(shè)置聊天室最大人數(shù)并驗證登錄Private Sub Command1_Click() MaxChan = Val()If MaxChan 1 Or MaxChan 100 Then = Else Unload MeEnd If End SubPrivate Sub Form_Load()Dim filepath As String sysfilepath = (1)If (sysfilepath amp。 DoEvents Else amp。 int timeout。 wrr[wrrear]=frame。 i++。 a=wsfront。 /*定義一個可存儲5個確認信息的*/ wsend *ws。 } else wss[a].timeout++。 scanf(%c,amp。 } } ch=getchar()。決定由哪一Winsock接受請求 For i = 0 To MaxChan 1 If sckServer(i).State = 0 Then Exit For End If Next i If i = MaxChan Then requestID Exit Sub End If If sckServer(i).State = 0 Then sckServer(i).Accept requestID Exit Sub End If 39。 038868, index) For i = 0 To 1 ss = ss amp。 人在線 S = ~~~~~~ amp。 recUser amp。 RemoteComputerName為服務(wù)器端的計算機名或IP地址。 Chr(13) amp。 悄悄對 amp。清除退出者IP記錄 userState(index) = 0 39。State=-1 正常終止 39。加入到在線列表 user(index) zxrs =