用Winsock,TCP协议,传输文件时,代码如下:
'Send
Private Sub CmdSend_Click()
    Dim myFile() As Byte
    Dim lngFile As Long
    Dim FileName As String
    Static i As Single
        FileName = VB.App.Path & "\my.gif"
        lngFile = FileLen(FileName)
        ReDim myFile(lngFile - 1) As Byte
        Open FileName For Binary As #1
        Get #1, , myFile
        Close #1
        WskClient.SendData myFile
End Sub'Receive
Private Sub WskServer_DataArrival(Index As Integer, ByVal bytestotal As Long)
    Static i As Long
    Dim myFile() As Byte
    Dim myLong As Double
    Dim myPath As String
    myPath = VB.App.Path & "\my.gif"
    ReDim myFile(0 To bytestotal - 1)
    WskServer(Index).GetData myFile
    Open myPath For Binary As #1
    Put #1, lenth + 1, myFile
    Close #1
    lenth = lenth + UBound(myFile) - LBound(myFile) + 1
End Sub上面是没有进行拆包,一次发送文件的程序,请问怎样在发送时拆包,接受时合并包?

解决方案 »

  1.   

    http://community.csdn.net/Expert/topic/3515/3515059.xml?temp=.4958155
    要简单的话,程序不用动,把socket改成tcp一样传
      

  2.   

    Option Explicit
    '==============================================
    '===============================
    'udp传文件
    '客户端
    '作者: 影子
    '================================
    '==============================================
    Dim FileNumber As Integer '用来存文件的句柄
    Dim LenFile As Long '文件的长度
    Private Sub Command2_Click()
    closefile
    End SubPrivate Sub Form_Load()
    Winsock0.LocalPort = 5698
    Winsock0.Listen
    beginfile
    End Sub
    Private Sub Winsock0_ConnectionRequest(ByVal requestID As Long)
        If Me.Winsock0.State <> sckClosed Then Me.Winsock0.Close
        Me.Winsock0.Accept requestID
    End Sub
    Private Sub Winsock0_DataArrival(ByVal bytesTotal As Long)
    Dim FileByte() As Byte
    Winsock0.GetData FileByte, vbArray + vbByte '接收类型为:字节数组
    Dim mendByte() As Byte, i As Long, j As Long
    Dim temp As String, temp1 As String
    '获得包长
    j = UBound(FileByte)
    '合并包头
      For i = 0 To 7 Step 2
            temp = temp & Chr(FileByte(i))
      Next
    '比较长度看丢包没有
    If Val(temp) = j Then    ReDim mendByte(j - 8)
    '    提出包头
            For i = 0 To j - 8
                mendByte(i) = FileByte(i + 7)
            Next
    '        写文件
        Put #FileNumber, , mendByte
    '    发送继续发送的请求
        frmmain.Winsock0.SendData "ok"
    Else
    '出现丢包,请求重发
        frmmain.Winsock0.SendData "no"
    End If
    End SubPublic Sub beginfile()
     FileNumber = FreeFile '取得未使用的文件号
    Open "c:\aaa.exe" For Binary As #FileNumber '打开文件
    End SubPublic Sub closefile() '关闭文件句柄
         Close #FileNumber
    End SubOption Explicit
    Dim GetFileNum As Integer
    Dim LenFile As Long
    Dim Sendbaye() As Byte '发送的包
    '===============================
    'udp传文件
    '作者: 影子
    '服务器端
    '================================
    Private Sub Command1_Click()
            GetFileNum = FreeFile '取得未使用的文件号
            LenFile = FileLen("d:\aa.rar") '获得需传送的文件的长度
            Open "d:\aa.rar" For Binary As #GetFileNum '打开需传送的文件
            Command1.Enabled = False
    '        传送文件
            Call TCPSendFile(frmmain.Winsock0, GetFileNum, SplitFile)
            Text1.Text = Now
    End SubPrivate Sub Form_Load()
    frmmain.Winsock0.RemoteHost = "192.168.0.12" '服务器ip
    frmmain.Winsock0.RemotePort = 5698
    Winsock0.ConnectEnd Sub
    '=========================================================================
    '为了清晰,下面分别用两个子过程来完成计算这次还可以传多少个字节的数据和传送数据
    '==========================================================================
    Private Function SplitFile() As Long '拆包
            On Error Resume Next
            Dim GetCount As Long
            '计算出这次可发送的字节数
            If LenFile >= 4000 Then
            GetCount = 4000
            LenFile = LenFile - GetCount
            Else
            GetCount = LenFile
            LenFile = LenFile - GetCount
            End If
            SplitFile = GetCountEnd Function
    Private Sub TCPSendFile(objWinSock As Winsock, FileNumber As Integer, SendLen As Long)
            Dim FileByte() As Byte, i As Long, j As Long
            Dim temp As String
            ReDim Sendbaye(0)
            
            Dim tempa As String * 4
            ReDim FileByte(SendLen - 1)
            tempa = SendLen + 7
            Sendbaye = tempa ' 把长度负值给包头
            Get #FileNumber, , FileByte '读取文件
            ReDim Preserve Sendbaye(SendLen + 7) '把包头+到文件头
            For i = 0 To UBound(FileByte)
                Sendbaye(i + 7) = FileByte(i)
            Next
            frmmain.Winsock0.SendData Sendbaye
    End SubPrivate Sub Winsock0_DataArrival(ByVal bytesTotal As Long)
    Dim str As String
    frmmain.Winsock0.GetData str
    Select Case str
    Case "ok"
    '成功继续发送
            If LenFile = 0 Then '发送完成
                MsgBox "成功"
                Exit Sub
            End If
           Call TCPSendFile(frmmain.Winsock0, GetFileNum, SplitFile)
    Case "no"
    '不成功重发上一个包
            frmmain.Winsock0.SendData Sendbaye
    End Select
    End Sub
      

  3.   

    看这个,我在家没有环境,你测试以下,应该没问题,明天去单位在测试
    Option Explicit
    '==============================================
    '===============================
    'udp传文件
    '客户端
    '作者: 影子
    '================================
    '==============================================
    Dim FileNumber As Integer '用来存文件的句柄
    Dim LenFile As Long '文件的长度
    Private Sub Command2_Click()
    closefile
    End SubPrivate Sub Form_Load()
    Winsock0.LocalPort = 5698
    Winsock0.Listen
    beginfile
    End SubPrivate Sub Winsock0_ConnectionRequest(ByVal requestID As Long)
        If Me.Winsock0.State <> sckClosed Then Me.Winsock0.Close
        Me.Winsock0.Accept requestID
    End SubPrivate Sub Winsock0_DataArrival(ByVal bytesTotal As Long)
    Dim FileByte() As Byte
    Winsock0.GetData FileByte, vbArray + vbByte '接收类型为:字节数组
    '        写文件
        Put #FileNumber, , FileByte, 
    '    发送继续发送的请求
        frmmain.Winsock0.SendData "ok"End SubPublic Sub beginfile()
     FileNumber = FreeFile '取得未使用的文件号
    Open "c:\aaa.exe" For Binary As #FileNumber '打开文件
    End SubPublic Sub closefile() '关闭文件句柄
         Close #FileNumber
    End SubOption Explicit
    Dim GetFileNum As Integer
    Dim LenFile As Long
    Dim Sendbaye() As Byte '发送的包
    '===============================
    'udp传文件
    '作者: 影子
    '服务器端
    '================================
    Private Sub Command1_Click()
            GetFileNum = FreeFile '取得未使用的文件号
            LenFile = FileLen("d:\aa.rar") '获得需传送的文件的长度
            Open "d:\aa.rar" For Binary As #GetFileNum '打开需传送的文件
            Command1.Enabled = False
    '        传送文件
            Call TCPSendFile(frmmain.Winsock0, GetFileNum, SplitFile)
            Text1.Text = Now
    End SubPrivate Sub Form_Load()
    frmmain.Winsock0.RemoteHost = "192.168.0.12" '服务器ip
    frmmain.Winsock0.RemotePort = 5698
    Winsock0.ConnectEnd Sub
    '=========================================================================
    '为了清晰,下面分别用两个子过程来完成计算这次还可以传多少个字节的数据和传送数据
    '==========================================================================
    Private Function SplitFile() As Long '拆包
            On Error Resume Next
            Dim GetCount As Long
            '计算出这次可发送的字节数
            If LenFile >= 4000 Then
            GetCount = 4000
            LenFile = LenFile - GetCount
            Else
            GetCount = LenFile
            LenFile = LenFile - GetCount
            End If
            SplitFile = GetCountEnd Function
    Private Sub TCPSendFile(objWinSock As Winsock, FileNumber As Integer, SendLen As Long)
            Dim FileByte() As Byte
            
          
            
            Dim tempa As String * 4
            ReDim FileByte(SendLen - 1)
       
            Get #FileNumber, , FileByte '读取文件
         
            frmmain.Winsock0.SendData FileByte 
    End SubPrivate Sub Winsock0_DataArrival(ByVal bytesTotal As Long)
    Dim str As String
    frmmain.Winsock0.GetData str
    Select Case str
    Case "ok"
    '成功继续发送
            If LenFile = 0 Then '发送完成
                MsgBox "成功"
                Exit Sub
            End If
           Call TCPSendFile(frmmain.Winsock0, GetFileNum, SplitFile)End Select
    End Sub
      

  4.   

    那就自定义一个协议啦。
    分成7K一个包。在包头加入一标记:如:是数据包(1byte),包的顺序(2byte),后面就是数据了。
    接收时,就可以按标记重组了。
      

  5.   

    象楼主那样不拆包用TCP传送有什么问题吗?
      

  6.   

    以什么方式编译最好,是dll还是Com+?
      

  7.   

    调试的时候有时候是好的,有时候还是有问题,错误提示还是一样, zyg0(影子(转了1圈,我又回来了),既然改了,能不能该你以前那个改进的UDP传输的(那个发到我们邮箱里面的)?