Public Sub sendFiletoMS(ByVal skt As Socket, ByVal mszh As UInt16, ByVal fldata As Byte(), ByVal fn_ms As String)
        Dim baarsends As New List(Of Byte)  '创建命令集数据列表
        '“ALC”头码 3个字节、站号(2个字节)、功能码(1个字节)、数据总字节数(4个字节)、实际数据(N个字节);
        '01 发送文件,格式:文件名长度占1字节、文件名(包括后缀)、本次文件存储开始(地址4字节)(考虑文件分段传送),文件数据字节数(4字节),文件数据;
        Dim alc() As Byte = Encoding.Default.GetBytes("ALC")
        For Each b As Byte In alc
            baarsends.Add(b)
        Next
        '写入站号2byte
        Dim zhd() As Byte = System.BitConverter.GetBytes(mszh)
        Array.Reverse(zhd)
        For Each b As Byte In zhd
            baarsends.Add(b)
        Next
        '写入能能码
        baarsends.Add(CByte(1))
        '写入数据长度2byte
        Dim fndata() As Byte = Encoding.Default.GetBytes(fn_ms) '文件名数据
        '命令行固定数据长度10字节,文件格式固定数据长度9字节
        Dim datalen As UInt32 = 19 + fndata.Length + fldata.Length '12个固定编码+文件名数据长度+文件数据长度
        Dim datalend() As Byte = System.BitConverter.GetBytes(datalen)
        Array.Reverse(datalend)
        For Each b As Byte In datalend
            baarsends.Add(b)
        Next
        '实际数据部分------------------------------------------------------
        '写入文件名长度1byte
        baarsends.Add(CByte(fndata.Length))
        '写入文件名数据
        For Each b As Byte In fndata
            baarsends.Add(b)
        Next
        '写入文件数据地址
        Dim dtaddr As UInt32 = baarsends.Count + 7
        Dim dtaddrd() As Byte = System.BitConverter.GetBytes(dtaddr)
        Array.Reverse(dtaddrd)
        For Each b As Byte In dtaddrd
            baarsends.Add(b)
        Next
        '写入文件数据长度
        Dim fdtl As UInt32 = fldata.Length
        Dim fdtld() As Byte = System.BitConverter.GetBytes(fdtl)
        Array.Reverse(fdtld)
        For Each b As Byte In fdtld
            baarsends.Add(b)
        Next
        '写入文件数据
        For Each b As Byte In fldata
            baarsends.Add(b)
        Next
        skt.Send(baarsends.ToArray)
    End Sub
发送代码
Protected Overridable Sub ReadCallback(ByVal ar As IAsyncResult)
        Dim content As String = String.Empty
        Dim state As StateObject = CType(ar.AsyncState, StateObject)
        Dim handler As Socket = state.workSocket
        Try
            Dim bytesRead As Integer = handler.EndReceive(ar)
            '此处处理消息
            'REV_mssageNOW(Encoding.Default.GetString(state.buffer))            For Each b As Byte In state.buffer
                RevData_List.Add(b)
            Next
            Dim Data() As Byte = RevData_List.ToArray
            Dim dtlld(3) As Byte
            For i = 0 To 3
                dtlld(i) = Data(i + 6)
            Next
            Array.Reverse(dtlld)
            Dim datalen As UInt32 = BitConverter.ToUInt32(dtlld, 0)            If RevData_List.Count > datalen Then                '“ALC”头码 3个字节、站号(2个字节)、功能码(1个字节)、数据总字节数(4个字节)、实际数据(N个字节);
                '01 发送文件,格式:文件名长度占1字节、文件名(包括后缀)、本次文件存储开始(地址4字节)(考虑文件分段传送),文件数据字节数(4字节),文件数据;
                Dim inx As UInt32 = 0
                Dim tmdata(2) As Byte
                For i = 0 To 2
                    tmdata(i) = Data(inx)
                    inx += 1
                Next
                Dim tm As String = Encoding.Default.GetString(tmdata)
                If tm = "ALC" Then
                    Dim zhd(1) As Byte
                    For i = 0 To 1
                        zhd(i) = Data(inx)
                        inx += 1
                    Next
                    Array.Reverse(zhd)
                    Dim zh As UInt16 = BitConverter.ToUInt16(zhd, 0)
                    Dim gnm As Byte = Data(inx)
                    inx += 1
                    Dim dtld(3) As Byte
                    For i = 0 To 3
                        dtld(i) = Data(inx)
                        inx += 1
                    Next
                    Array.Reverse(dtld)
                    Dim dtl As UInt32 = BitConverter.ToUInt32(dtld, 0)
                    Select Case gnm
                        Case 1
                            Dim flnl As Byte = Data(inx)
                            inx += 1
                            Dim flnd(flnl - 1) As Byte
                            For i = 0 To flnl - 1
                                flnd(i) = Data(inx)
                                inx += 1
                            Next
                            Dim fn As String = Encoding.Default.GetString(flnd.ToArray)
                            Dim filename As String = My.Computer.FileSystem.SpecialDirectories.Desktop & "\" & fn                            Dim fladdrd(3) As Byte
                            For i = 0 To 3
                                fladdrd(i) = Data(inx)
                                inx += 1
                            Next
                            Array.Reverse(fladdrd)
                            Dim fladdr As UInt32 = BitConverter.ToUInt32(fladdrd, 0)
                            Dim fldld(3) As Byte
                            For i = 0 To 3
                                fldld(i) = Data(inx)
                                inx += 1
                            Next
                            Array.Reverse(fldld)
                            Dim fldl As UInt32 = BitConverter.ToUInt32(fldld, 0)
                            Using writer As BinaryWriter = New BinaryWriter(File.Open(filename, FileMode.Create))
                                For i = 0 To fldl - 1
                                    writer.Write(Data(inx))
                                    inx += 1
                                Next
                            End Using
                    End Select
                End If
                RevData_List = New List(Of Byte)
            End If            handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, New AsyncCallback(AddressOf ReadCallback), state)
        Catch ex As Exception
        End Try
    End Sub 'ReadCallback
以上用SOCKET接收代码
 Private Sub ReadCallback(ByVal result As IAsyncResult)
        Dim read As Integer
        Try
            ntstream = client.GetStream()
            read = ntstream.EndRead(result)
        Catch
            'An error has occured when reading
            Return
        End Try
        If read = 0 Then
            'The connection has been closed.
            Return
        End If
        Dim buffer As Byte() = TryCast(result.AsyncState, Byte())
        RevData_List.AddRange(buffer)
        '“ALC”头码 3个字节、数据总字节数(4个字节)、功能码(1个字节)、站号(2个字节)、实际数据(N个字节)、CRC16(2字节)
        '   0                    3                         7                    8               10
        Dim Data() As Byte = RevData_List.ToArray
        Dim dtlld(3) As Byte
        For i = 0 To 3
            dtlld(i) = Data(i + 6)
        Next
        Array.Reverse(dtlld)
        Dim datalen As UInt32 = BitConverter.ToUInt32(dtlld, 0)
        If RevData_List.Count > datalen Then            '“ALC”头码 3个字节、站号(2个字节)、功能码(1个字节)、数据总字节数(4个字节)、实际数据(N个字节);
            '01 发送文件,格式:文件名长度占1字节、文件名(包括后缀)、本次文件存储开始(地址4字节)(考虑文件分段传送),文件数据字节数(4字节),文件数据;
            Dim inx As UInt32 = 0
            Dim tmdata(2) As Byte
            For i = 0 To 2
                tmdata(i) = Data(inx)
                inx += 1
            Next
            Dim tm As String = Encoding.Default.GetString(tmdata)
            If tm = "ALC" Then
                Dim zhd(1) As Byte
                For i = 0 To 1
                    zhd(i) = Data(inx)
                    inx += 1
                Next
                Array.Reverse(zhd)
                Dim zh As UInt16 = BitConverter.ToUInt16(zhd, 0)
                Dim gnm As Byte = Data(inx)
                inx += 1
                Dim dtld(3) As Byte
                For i = 0 To 3
                    dtld(i) = Data(inx)
                    inx += 1
                Next
                Array.Reverse(dtld)
                Dim dtl As UInt32 = BitConverter.ToUInt32(dtld, 0)
                Select Case gnm
                    Case 1
                        Dim flnl As Byte = Data(inx)
                        inx += 1
                        Dim flnd(flnl - 1) As Byte
                        For i = 0 To flnl - 1
                            flnd(i) = Data(inx)
                            inx += 1
                        Next
                        Dim fn As String = Encoding.Default.GetString(flnd.ToArray)
                        Dim filename As String = My.Computer.FileSystem.SpecialDirectories.Desktop & "\" & fn                        Dim fladdrd(3) As Byte
                        For i = 0 To 3
                            fladdrd(i) = Data(inx)
                            inx += 1
                        Next
                        Array.Reverse(fladdrd)
                        Dim fladdr As UInt32 = BitConverter.ToUInt32(fladdrd, 0)
                        Dim fldld(3) As Byte
                        For i = 0 To 3
                            fldld(i) = Data(inx)
                            inx += 1
                        Next
                        Array.Reverse(fldld)
                        Dim fldl As UInt32 = BitConverter.ToUInt32(fldld, 0)
                        Using writer As BinaryWriter = New BinaryWriter(File.Open(filename, FileMode.Create))
                            For i = 0 To fldl - 1
                                writer.Write(Data(inx))
                                inx += 1
                            Next
                        End Using
                End Select
            End If
            RevData_List = New List(Of Byte)
        End If
        ntstream.BeginRead(buffer, 0, buffer.Length, AddressOf ReadCallback, buffer)
    End Sub
以上用NetworkStream+TcpClient
直接使用SOCKET接收数据有问题,不知道为什么会这样