下面是我的代碼:
接收端我試過在裡面加入代碼計算接收過多少次數據包
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
接收端我試過在裡面加入代碼計算接收過多少次數據包
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
下面我把代碼精減了一下
方面大家看
沒做過這個的也可以從中學點經驗發送端:
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
不過我調試後發現情況是這樣的發送端發送大於8K文件時
會將文件分割成若干個8K的小文件發送,最後發送殘余文件
發現接收端只會接收第一個8K的小文件和最後的殘余文件看代碼實在是看不出問題
有興趣的朋友可以在自己機上試一下
問題很怪