救命啊,文件写入为什么会出错?

didibaba 2002-04-22 11:29:22
最近要写一个用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?
...全文
30 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
dudu320 2002-04-22
  • 打赏
  • 举报
回复
正常,UDP不保证数据的完整性
除非你每发一个包,接受方收到后发一个接受应答,然后在发第二个包,否则发第一个包
不过还不如用TCP/IP
didibaba 2002-04-22
  • 打赏
  • 举报
回复
superzhou(学海无涯) :我会的,给出得分也不能收回,我留着有什么用。如果我改成TCP/IP可以,一定给分。
SuperZhou 2002-04-22
  • 打赏
  • 举报
回复
如果我回答的正确,请给分吧,我的分快完了
SuperZhou 2002-04-22
  • 打赏
  • 举报
回复
用TCP/IP可以保证数据准确无误的到达,你只要接收数据无误就可以了,何必要那么严格的要求呢?
didibaba 2002-04-22
  • 打赏
  • 举报
回复
是否改为TCP/IP会好一点?再用time来控制一下。(我试一下先)
SuperZhou 2002-04-22
  • 打赏
  • 举报
回复
只要你取了数据,缓存自动清除.
SuperZhou 2002-04-22
  • 打赏
  • 举报
回复
这是正常现象,不可能那么准确的,况且你用的是UDP协议,数据到达的时间不是按发送的先后顺序的。
didibaba 2002-04-22
  • 打赏
  • 举报
回复
thorkhan(灰滿) :怎么清除緩存?
thorkhan 2002-04-22
  • 打赏
  • 举报
回复
是不是緩存沒有清除

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧