VB winsock接收数据处理的问题

时间:2022-10-09 23:43:20
在接收数据时,数据长度不定,但是有一组数据比较大,是分多个包发送过来的,经抓包查看,此时的返回的数据包为(12byte包头+DATA包+……+DATA包+校验和包),其中第一个包为12byte的头文件,其中有整个数据的长度,当遇到这个数据是,怎么样处理才能把所有的数据接收完,并放入一个数组或是字串中?
本人小白,请高手指点,我的接收数据代码如下:
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim S, S3, s1, flag, flag1 As String
Dim id, strlen As Integer
Dim tmp As String
Dim str() As Byte
Winsock1.getData str()
strdata = StrConv(str(), vbUnicode)                                    '转换为字符串,
flag = Left(strdata, 2)

'log.Text = log.Text & Format(Hour(Time), "00") & ":" & Format(Minute(Time), "00") & ":" & Format(Second(Time), "00") & " " & strdata   '显示日志
'log.SelStart = Len(log.Text)

Select Case flag
   
   Case "E1"                                        '登录
      Sleep 200
      Login   '登录
      log.Text = log.Text & Format(Hour(Time), "00") & ":" & Format(Minute(Time), "00") & ":" & Format(Second(Time), "00") & " " & "admin" & vbCrLf  '显示日志

  Case "E0"                                          '仪器执行命令成功
       u = u + 1
       log.Text = log.Text & Format(Hour(Time), "00") & ":" & Format(Minute(Time), "00") & ":" & Format(Second(Time), "00") & " " & strdata   '显示日志
       log.SelStart = Len(log.Text)
        If u = 1 Then
    '     Sleep 500
        log.Text = log.Text & Format(Hour(Time), "00") & ":" & Format(Minute(Time), "00") & ":" & Format(Second(Time), "00") & " " & "登录成功" & vbCrLf   '显示日志
        state_lab = "TCP/IP Connect OK"                  '登录成功
        log.SelStart = Len(log.Text)
        End If
  Case "EA"                                         '温度值返回
       S = strdata
       log.Text = log.Text                          '不显示日志
       log.SelStart = Len(log.Text)
        S3 = Split(S, "^C", , vbTextCompare)
        For j = 1 To UBound(S3)
            s1 = Split(S3(j), vbCrLf)(0)
            s1 = Trim(s1)
            If Format(s1) > Val(Form4.CH(j - 1)) Then
            Form4.CH(j - 1) = Format(s1, "00.0")
            End If
        Next j
        
  Case "EB"                                         '二进制数据返回,可以是设定信息,也可以是画面数据
      tmp = StrConv(str(), vbUnicode)
      id = str(9)                                   '取ID ,测试ok
      strlen = HEX_to_DEC(Hex(str(4)) & Hex(str(5)) & Hex(str(6)) & Hex(str(7)))            '取数据长度,测试OK
     
   在此位置该如何处理才能先接收全部的数据??
  数据格式和使用Wireshark抓包的数据截图如下图


      If id = 19 Then                               '如果ID为19,则为设定信息输出    
       此处为对接收的数据进行处理,同上面温度值取出
      End If
End Select
下图为仪器返回数据的格式。
VB winsock接收数据处理的问题

4 个解决方案

#1


既然是以字节流接收,就应先判断接收的12byte包头来设置动态数组的接收长度,待接收到完整数据包后,判断和处理数据。

#2


不好意思,问题我讲的不够清楚,我的程序是要控制一台仪器,仪器返回数据有以下几种情况:
1:当发送控制指令时,执行成功时仅近回“E0+CRLF“,错误时会返回“E1+错误代码+内容提示“
2:当发送输出命令时,返回数据分两种情况,一种是文本输出,格式为"EA +CRLF+文本内容+EN CRLF",另一种就是BINARY输出,格式为“12byte(EB+CRLF+数据长度+FLAG+ID+校验)+数据+EN+校验”具体格式参考1楼图片,
我现在遇到的问题为以下几点;
1:接收长度超过8192的情况下如何多次接收并合并数据。
2:我现在的接收过程是否适合这种多种响应格式的处理?不合适该如何改?
3:BINARY格式的数据怎么样从中去头去尾,只保留有效数据。
本人小白,请大哥帮帮忙!

#3


引用 2 楼 hcyang1422 的回复:
不好意思,问题我讲的不够清楚,我的程序是要控制一台仪器,仪器返回数据有以下几种情况:
1:当发送控制指令时,执行成功时仅近回“E0+CRLF“,错误时会返回“E1+错误代码+内容提示“
2:当发送输出命令时,返回数据分两种情况,一种是文本输出,格式为"EA +CRLF+文本内容+EN CRLF",另一种就是BINARY输出,格式为“12byte(EB+CRLF+数据长度+FLAG+ID+校验)+数据+EN+校验”具体格式参考1楼图片,
我现在遇到的问题为以下几点;
1:接收长度超过8192的情况下如何多次接收并合并数据。
2:我现在的接收过程是否适合这种多种响应格式的处理?不合适该如何改?
3:BINARY格式的数据怎么样从中去头去尾,只保留有效数据。
本人小白,请大哥帮帮忙!

1)接收长度超过8192,请在本坛搜索解决方法。
2)凡二进制与字符截收并存的,先以字节流接收,经判断后交由各自数据处理过程处理。
3)二进制数据,按数据规约,取出后用API来处理,可参考:
http://blog.csdn.net/zdingyun/article/details/4565659
http://blog.csdn.net/zdingyun/article/details/2528026

#4


不知道有多少前人掉在TCP Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
http://bbs.csdn.net/topics/380167545

#1


既然是以字节流接收,就应先判断接收的12byte包头来设置动态数组的接收长度,待接收到完整数据包后,判断和处理数据。

#2


不好意思,问题我讲的不够清楚,我的程序是要控制一台仪器,仪器返回数据有以下几种情况:
1:当发送控制指令时,执行成功时仅近回“E0+CRLF“,错误时会返回“E1+错误代码+内容提示“
2:当发送输出命令时,返回数据分两种情况,一种是文本输出,格式为"EA +CRLF+文本内容+EN CRLF",另一种就是BINARY输出,格式为“12byte(EB+CRLF+数据长度+FLAG+ID+校验)+数据+EN+校验”具体格式参考1楼图片,
我现在遇到的问题为以下几点;
1:接收长度超过8192的情况下如何多次接收并合并数据。
2:我现在的接收过程是否适合这种多种响应格式的处理?不合适该如何改?
3:BINARY格式的数据怎么样从中去头去尾,只保留有效数据。
本人小白,请大哥帮帮忙!

#3


引用 2 楼 hcyang1422 的回复:
不好意思,问题我讲的不够清楚,我的程序是要控制一台仪器,仪器返回数据有以下几种情况:
1:当发送控制指令时,执行成功时仅近回“E0+CRLF“,错误时会返回“E1+错误代码+内容提示“
2:当发送输出命令时,返回数据分两种情况,一种是文本输出,格式为"EA +CRLF+文本内容+EN CRLF",另一种就是BINARY输出,格式为“12byte(EB+CRLF+数据长度+FLAG+ID+校验)+数据+EN+校验”具体格式参考1楼图片,
我现在遇到的问题为以下几点;
1:接收长度超过8192的情况下如何多次接收并合并数据。
2:我现在的接收过程是否适合这种多种响应格式的处理?不合适该如何改?
3:BINARY格式的数据怎么样从中去头去尾,只保留有效数据。
本人小白,请大哥帮帮忙!

1)接收长度超过8192,请在本坛搜索解决方法。
2)凡二进制与字符截收并存的,先以字节流接收,经判断后交由各自数据处理过程处理。
3)二进制数据,按数据规约,取出后用API来处理,可参考:
http://blog.csdn.net/zdingyun/article/details/4565659
http://blog.csdn.net/zdingyun/article/details/2528026

#4


不知道有多少前人掉在TCP Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
http://bbs.csdn.net/topics/380167545