下面是我的代碼:
接收端我試過在裡面加入代碼計算接收過多少次數據包
static iii as long
iii=iii+1
結果iii總是等於3或2
很郁悶
大家幫看一下代碼什麼地方有問題
幫解決的給個吉利分(88分)發送端:
Dim i As Long
Dim filenum As Long
filenum = FileLen(CommonDialog1.FileName)If filenum > 8192 Then '此文件大於8K
Dim fileresidual As Long
fileresidual = filenum Mod 8192
ReDim B(8191) As Byte  '發送文件
For ii = 1 To filenum \ 8192
Open CommonDialog1.FileName For Binary As #1
Get #1, i + 1, B
Close #1
Winsock2.SendData B
i = i + 8192
Erase B
DoEvents
Next ii
ReDim R(fileresidual - 1) As Byte  '發送剩余文件
Open CommonDialog1.FileName For Binary As #2
Get #2, i + 1, R
Close #2
Winsock2.SendData R
Winsock2.SendData "☆☆☆文件發送完畢★★★ Label"
CommonDialog1.FileName = ""
Text4.Text = Text4.Text & vbCrLf & "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" & vbCrLf & "文件發送完畢。" & vbCrLf & vbTab & vbTab & vbTab & vbTab & Now() & vbCrLf & "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" & vbCrLf
Exit Sub
Else
ReDim B(filenum - 1) As Byte  '發送不足8K的文件
Open CommonDialog1.FileName For Binary As #1
Get #1, 1, B
Close #1
Winsock2.SendData B
Winsock2.SendData "☆☆☆文件發送完畢★★★ Label"
CommonDialog1.FileName = ""
Text4.Text = Text4.Text & vbCrLf & "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" & vbCrLf & "文件發送完畢。" & vbCrLf & vbTab & vbTab & vbTab & vbTab & Now() & vbCrLf & "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" & vbCrLf
Exit Sub
End If
End If接收端:
Private Sub Winsock2_DataArrival(ByVal bytesTotal As Long)
Dim tempstr As String
Static DataLen As Long
If DataLen = 0 Then DataLen = 1
ReDim S(bytesTotal - 1) As Byte
Winsock2.GetData S, vbArray + vbByte
Open CommonDialog2.FileName For Binary As #1   ' 打??出文件。
Put #1, DataLen, S
Close #1
Erase S
DataLen = DataLen + bytesTotal
Winsock2.GetData tempstr, vbStringIf tempstr = "☆☆☆文件發送完畢★★★ Label" Then
Text4.Text = Text4.Text & vbCrLf & "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" & vbCrLf & "文件接收完畢,請查看。" & vbCrLf & vbTab & vbTab & vbTab & vbTab & Now() & vbCrLf & "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" & vbCrLf
Text4.SelStart = Len(Text4.Text)
Close #2
End If
End Sub

解决方案 »

  1.   

    很感謝樓上的兄台耐心看我的代碼,發現在確實是我的疏忽,但不是關鍵問題
    下面我把代碼精減了一下
    方面大家看
    沒做過這個的也可以從中學點經驗發送端: 
    Dim i As Long 
    Dim filenum As Long 
    i = 1
    filenum = FileLen(CommonDialog1.FileName) 
    If filenum > 8192 Then '此文件大於8K,分多次發送
    Dim fileresidual As Long 
    fileresidual = filenum Mod 8192 
    ReDim B(8191) As Byte  '分多次發送,一次發送8K大小 
    For ii = 1 To filenum \ 8192 
    Open CommonDialog1.FileName For Binary As #1 
    Get #1, i , B 
    Close #1 
    Winsock2.SendData B 
    i = i + 8192 
    Erase B 
    DoEvents 
    Next ii 
    ReDim R(fileresidual - 1) As Byte  '發送剩余文件 
    Open CommonDialog1.FileName For Binary As #2 
    Get #2, i , R 
    Close #2 
    Winsock2.SendData R 
    Else 
    ReDim B(filenum - 1) As Byte  '文件不足8K,一次性發送 
    Open CommonDialog1.FileName For Binary As #1 
    Get #1, 1, B 
    Close #1 
    Winsock2.SendData B 
    End If 接收端: 
    Private Sub Winsock2_DataArrival(ByVal bytesTotal As Long) 
    Static DataLen As Long 
    If DataLen = 0 Then DataLen = 1 
    ReDim S(bytesTotal - 1) As Byte 
    Winsock2.GetData S, vbArray + vbByte 
    Open CommonDialog2.FileName For Binary As #1  
    Put #1, DataLen, S 
    Close #1 
    Erase S 
    DataLen = DataLen + bytesTotal 
    End Sub 
      

  2.   

    数据接收时,数据长度应取Winsock1.BytesReceived的值,bytesTotal值不准确,会出错误,建议接收时使用如下代码:Winsock1.GetData S, vbArray + vbByte, Winsock1.BytesReceived。
      

  3.   

    問題沒有解決
    不過我調試後發現情況是這樣的發送端發送大於8K文件時
    會將文件分割成若干個8K的小文件發送,最後發送殘余文件
    發現接收端只會接收第一個8K的小文件和最後的殘余文件看代碼實在是看不出問題
    有興趣的朋友可以在自己機上試一下
    問題很怪
      

  4.   

    winsock当数据大于8k时会自动分包发送,无需你用代码去干涉,你要做的工作就是在发送端构造好你的包,简单的说就是包头+数据+尾包,接收端只要判断是不是尾包,就知道数据是不是已经接收完成了,再根据你包结构还原数据就行了。这个问题好象经常有讨论,在论坛上搜索一下吧