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接收数据有问题,不知道为什么会这样
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接收数据有问题,不知道为什么会这样
第一张SOCKET接收的
第二张NetworkStream+TcpClient接收