救命啊,文件写入为什么会出错?
最近要写一个用winsock(使用协议UDP)传输文件的程序,本人源代码如下:
(为了调试方便从本机一个端口输出文件,再由本机的另外一个端口接收数据)
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
发送端程序如下:
Private Sub Command1_Click()
Dim blockSize As Long
Dim temp As String
blockSize = 2048 '定义一次读入数据大小
hin = FreeFile '取得未使用的文件号
'二进制打开文件
Open App.Path + "\1.doc" For Binary Access Read As hin
'文件长度
sizeOfFile = LOF(hin)
'循环写入数组
Do Until EOF(hin)
If sizeOfFile - Loc(hin) <= blockSize Then
blockSize = sizeOfFile - Loc(hin) + 1 'loc是返回当前读写位置
End If
temp = Space$(blockSize) '定义blocksize数量的空格
Get hin, , temp '读取特temp同样大小的数据
'发送数据
udpPeerB.SendData temp
Loop
Close hin
End Sub
Private Sub Form_Load()
'控件的名字为 udpPeerB。
With udpPeerB
'重点:必须将 RemoteHost 的值改为
'计算机的名字。
.RemoteHost = "192.168.0.111"
.RemotePort = 1002 '要连接的端口。
.Bind 1001 '绑定到本地的端口上。
End With
End Sub
Private Sub txtSend_Change()
'在键入后立即发送文本。
udpPeerB.SendData txtSend.Text
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
接收数据端程序:
Private Sub Form_Load()
'控件的名字为 udpPeerA
With udpPeerA
'重点:必须将 RemoteHost 的值
'修改为计算机的名字。
.RemoteHost = "192.168.0.111"
.RemotePort = 1001 '连接的端口号。
.Bind 1002 '绑定到本地的端口。
End With
End Sub
Private Sub txtSend_Change()
'在键入文本时,立即将其发送出去。
udpPeerA.SendData txtSend.Text
End Sub
Private Sub udpPeerA_DataArrival(ByVal bytesTotal As Long)
Dim x As Double
udpPeerA.GetData temp
If temp <> "" Then
'写入数据
Open App.Path + "\temp.doc" For Binary Access Write As 2
x = LOF(2)
Put #2,x+1 , temp
Close 2
End If
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
经过测试:
发送端拆分文件完全正确,发送文件也没有错。问题出在数据接收端,有时可接收到4个数据包、有时又可以接收到8个数据包。开始以为是局域网速度问题,后来改为本机传本机还缩小了数据包,结果还是一样的问题。WHY?