用UDP传送一个27K的图片
再本机上传送没问题
传送到其他机器上就不行了
图片要么只传了3分之一 之后就是乱的了。
麻烦分析下问题原因。
附代码
发送端
Private Sub Command1_Click()
'SendFile "E:\00050903104506出.jpg", udpPeerA
 Dim BytDate() As Byte
   Dim FileName As String
   Dim lngFile As Long
   Dim i As Long
        FileName = "E:\00050903104506出.jpg "              '取得文件名及路径
        lngFile = FileLen(FileName) \ 1024         '取得文件长度
        'Me.ProgressBar1.Min = 0
        'Me.ProgressBar1.Max = lngFile + 1
        'ProgressBar1.Value = 0
        For i = 0 To lngFile
            ReDim myFile(1023) As Byte                 '初始化数组
            Open FileName For Binary As #1             '打开文件
            Get #1, i * 1024 + 1, myFile                        '将文件写入数组
            Close #1                                   '关闭文件
            udpPeerA.SendData myFile                   '发送
            DoEvents
            'ProgressBar1.Value = ProgressBar1.Value + 1
        Next i
         'If ProgressBar1.Value = ProgressBar1.Max Then MsgBox "OK"
End Sub
接收端
Sub ReceiveData(FileName As String, Wnk As Winsock, Lens As Long) '接收数据
'FileName 文件保存的位置
Dim RecData() As Byte
Dim Length As Double
Dim FileNum As Integer
FileNum = FreeFile
Open FileName For Binary As FileNum
Length = FileLen(FileName)
ReDim RecData(1 To Lens)
Wnk.GetData RecData
Put FileNum, Length + 1, RecData
Close FileNum
End Sub

解决方案 »

  1.   

    Wnk.GetData RecData ,vbArray + vbByte试试
      

  2.   

    分段发送时每段间要加延时,否则由于发送过快,winsock会当一个包全部发送出去。
    而到了互联网经过路由器时,这个包大体又会在8K左右自动分包(有的网4K就会自动分包),这大概就是你1/3正常的原因。接收端你把动态数组长度设置为发送过来文件的长度,其实你每次触发事件时,都没有装满你的数组,也就是说它没有装到数据的部分全部为0,这样当你把数据组装的一起时,已经变样。建议你,发图时加数据头与数据尾和必要的校验,接收验证正确后去掉这些,把正确数据存成图片文件。另外,你可以把不正确的图片数据读入字节数组,然后观查错误原因。