网络实验报告(二)
——停--等协议
一、实验目的:
1.利用VB模拟停--等协议。
2.了解协议内容并模拟传输过程,掌握停--等协议的实现方法。
二、实验环境:
硬件环境:P4 1.6G.128M SDRAM。
系统环境:Windows98操作系统。
开发环境:Microsoft Visual Basic 6.0 中文版。
模拟环境:点到点的面向链接的通信。
三、桢格式:
注:
帧头与帧尾均为字符串“DLE STX”。
对将要发送的数据使用split()函数,以空格为标志进行分割,把数据分成以单词为单位的字符串数组,每次读取一个字符串。
以帧头+空格+数据+空格+帧尾为顺序组帧。分帧时使用split()函数,以空格为标志,把数据帧分解成字符串数组,读出数据,完成组帧。
四、程序流程图:
五、编程原理及思路:
由于接收缓冲只能存放一个帧且接收端需要一定的处理时间。为了防止发送快于接收而导致数据丢失,限制发送端在发送一帧后必须停止发送,等待接收端发确认帧。而接收端在收到一个数据帧并发送网络层后,向发送端发一确认帧。仅当接收方确认正确接收后再继续发送下一帧。
六、程序源代码(VB):
注:此程序的接收端和发送端是同一个程序的不同运行模式。
frmMain.frm:
Private g_bConfirm As Boolean '发送一帧后设置为False,收到后设置为True Private Sub cmdReceiverListen_Click()
'检查错误
If Val(txtReceiverPort.Text) = 0 Then
MsgBox "Please Input Port Number!", vbInformation, "ERROR"
Exit Sub
End If
'开始监听
With sckReceiver
.LocalPort = Val(txtReceiverPort.Text)
.Listen
End With
'显示信息
ShowInfo "Listening at : " & sckReceiver.LocalIP & " Port : " & txtReceiverPort.Text
cmdReceiverListen.Enabled = False
End Sub
Private Sub ShowInfo(ByVal sInfo As String)
'显示信息到列表
lstInfo.AddItem (sInfo)
lstInfo.ListIndex = lstInfo.ListCount - 1
End Sub
Private Sub cmdSenderConnect_Click()
'连接
If cmdSenderConnect.Caption = "&Connect" Then
If txtSenderHostIP.Text = "" Or txtSenderPort.Text = "" Then
MsgBox "Invalid IP address/port number input.", vbCritical, "ERROR"
Exit Sub
End If
With sckSender
.RemoteHost = txtSenderHostIP.Text
.RemotePort = Val(txtSenderPort.Text)
.Connect
ShowInfo "Connect To : " & .RemoteHost & " Port : " & .RemotePort End With
cmdSenderConnect.Caption = "Dis&connect"
cmdSenderSend.Enabled = True
Else
ShowInfo "Termination Of Connection To : " & sckSender.RemoteHost & " Port : " & sckSender.RemotePort
sckSender.Close
cmdSenderConnect.Caption = "&Connect"
cmdSenderSend.Enabled = False
End If
End Sub
Private Sub cmdSenderSend_Click()
'发送文字
Dim vOut As Variant
Dim lLoop As Long
g_bConfirm = True
vOut = modFrame.ToFrame(txtSenderMessage.Text)
ShowInfo "Sending Message To : " & sckSender.RemoteHostIP & " With """ & txtSenderMessage.Text & """"
For lLoop = 0 To UBound(vOut)
'循环输出帧
While Not g_bConfirm
DoEvents '等待
Wend
'能够发送
g_bConfirm = False
Debug.Print vOut(lLoop)
Dim sOut As String
sOut = vOut(lLoop)
sckSender.SendData sOut
Next
End Sub
Private Sub Form_Load()
tabMain_Click
End Sub
Private Sub sckReceiver_ConnectionRequest(ByVal requestID As Long)
'得到连接请求
With sckReceiver
.Close
.Accept requestID