vb 谁能看看这个小程序哪里错了

本例是用winsock传送文件。下面的代码是服务端的。由客户端向服务端发送文件。客户端选好文件后,点击发送文件大小,然后点击发送文件。

Option Explicit
Option Base 1
Dim file() As Byte
Dim flag As Integer
Dim flength, i As Long
Private Sub Command1_Click()
If Winsock1.State <> 0 Then Winsock1.Close
With Winsock1
.LocalPort = txtport.Text
.Bind
.Listen
End With
End Sub

Private Sub Form_Load()
flag = 0
End Sub

Private Sub Winsock1_connectionrequest(ByVal requestID As Long)
If Winsock1.State <> 0 Then Winsock1.Close
Winsock1.Accept (requestID)
MsgBox "接受连接请求"
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
If flag = 0 Then
Winsock1.GetData flength, vbLong
ReDim file(flength)
flag = 1
Else
Winsock1.GetData file, vbArray + vbByte
Status.SimpleText = "接收完文件……"
Open Text1.Text For Binary As #5
For i = 1 To flength
Put #5, i, file(i)
Next i
Close #5
Status.SimpleText = "接收完成"
flag = 0
End If
End Sub

结果运行后说是下标越界。出错的地方系统指出在Put #5, i, file(i)这句。为什么啊一直到Status.SimpleText = "接收完文件……"。这句都没问题。为什么后面会有问题呢?
按照一楼的说法改了后,发现在
ReDim file(flength)
这句就提示说“下标越界”了

楼主:你的错误在于认为WinSock触发DataArrival事件时,所有的数据都已经到达,实际上不是这样的,这受到发送与接收缓冲区大小的限制,一般是8KB左右.
你在DataArrival事件写了循环flength次,实际数据没有这么多,所以file(i)是越界.

改正方法:
Open Text1.Text For Binary As #5 '不要放在DataArrival里,不然每次有数据
到达都要执行.
file()变量也无需定义成模块级变量,更不必Redim,下面的我的一部分程序,file变量就不使用了.
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
If flag = 0 Then
Winsock1.GetData flength, vbLong
Open Text1.Text For Binary As #5
flag = 1
Else
Dim btyBuffers() As Byte '接收数组,这里不用file()了
Status.SimpleText = "正在接收文件……"
WinSock1.GetData btyBuffers, vbByte + vbArray, bytesTotal
Put #5, , btyBuffers '//将数据写入文件
If LOF(5)=flength Then
Status.SimpleText = "接收完成"
Close #5
flag=0
End If
End If
End Sub
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-08-06
Option Explicit
Option Base 1
Dim file() As Byte
Dim flag As Integer
Dim flength
Private Sub Command1_Click()
If Winsock1.State <> 0 Then Winsock1.Close
With Winsock1
.LocalPort = txtport.Text
.Bind
.Listen
End With
End Sub

Private Sub Form_Load()
flag = 0
End Sub

Private Sub Winsock1_connectionrequest(ByVal requestID As Long)
If Winsock1.State <> 0 Then Winsock1.Close
Winsock1.Accept (requestID)
MsgBox "接受连接请求"
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
If flag = 0 Then
Winsock1.GetData flength, vbLong
ReDim file(flength)
flag = 1
Else
Winsock1.GetData file, vbArray + vbByte
Status.SimpleText = "接收完文件……"
Open Text1.Text For Binary As #5
Put #5, , file
Close #5
Status.SimpleText = "接收完成"
flag = 0
End If
End Sub
相似回答