| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6751 人关注过本帖
标题:VB winsock接收数据处理的问题
只看楼主 加入收藏
hcyang1422
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2015-4-23
结帖率:0
收藏
已结贴  问题点数:20 回复次数:41 
VB winsock接收数据处理的问题
在接收数据时,数据长度不定,但是有一组数据比较大,是分多个包发送过来的,其中第一个包中有整个数据的长度,当遇到这个数据是,怎么样处理才能把所有的数据接收完,并放入一个数组或是字串中?
本人小白,请高手指点
搜索更多相关主题的帖子: 空间设计 
2015-04-23 00:51
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:5 
如果清楚数据格式,应该很容易接受并处理。其实winsocket发送接受数据更需要处理的是丢包情况,虽然tcp/ip协议说确保数据送达,但实际处理中,当不间断处理大于2k以上数据时的确会丢失数据。

能编个毛线衣吗?
2015-04-23 09:48
lianyicq
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:26
帖 子:737
专家分:3488
注 册:2013-1-26
收藏
得分:5 
回复 楼主 hcyang1422
没用动态数组?

大开眼界
2015-04-23 09:50
hcyang1422
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2015-4-23
收藏
得分:0 
我的源码如下,请大神帮忙看看中间红色部分该如何处理取完整数据
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

图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册


[ 本帖最后由 hcyang1422 于 2015-4-23 12:48 编辑 ]
2015-04-23 12:39
lianyicq
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:26
帖 子:737
专家分:3488
注 册:2013-1-26
收藏
得分:0 
回复 4楼 hcyang1422
分包传送的时候,非第一个包有没有设flag标志?
收到第一个数据包就从第八位开始取值赋到目标数组中,直至本包未两位。
检测到是大数据的分包,就继续向目标数组赋值,直至达到strlen
TCP/IP不用自己考虑校验吧,以前我在vnn上分包传大文件没出过错。

大开眼界
2015-04-23 13:52
hcyang1422
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2015-4-23
收藏
得分:0 
回复 5楼 lianyicq
其它包没有FLAG标志,
能帮忙写一下代码吗?
2015-04-23 13:58
lianyicq
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:26
帖 子:737
专家分:3488
注 册:2013-1-26
收藏
得分:0 
回复 6楼 hcyang1422
分包没有标志,那就只能case else了。
写了这么多代码,已经实现想要哪个字节就取得哪个字节了。自己完成吧。

大开眼界
2015-04-23 15:06
hcyang1422
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2015-4-23
收藏
得分:0 
回复 7楼 lianyicq
不可以使用case else的吧,因为接收到的数据文件类型还可能是不一样的,是要根据头包中的ID位来区分后再处理的。是否能在头包的case中,根据数据长度来完成接收呢?
2015-04-23 17:30
renxiaoyao36
Rank: 9Rank: 9Rank: 9
来 自:七宝中学
等 级:贵宾
威 望:31
帖 子:347
专家分:1077
注 册:2014-9-18
收藏
得分:5 
个人认为这和Winsock没关系
首先,Winsock传输的讯息用GetData后就相当于自己的本地变量了
你现在要做的只是把自己的本地变量想办法标示并将包含特定的字符的变量互相组合
寻找特定的字符串可以用Instr但是要求是传输的讯息丽没有标示字符

编程蛋疼的不是枯燥,而是辛辛苦苦编完几百行的代码,运行,“Runtime Error “xxx””。
2015-04-23 18:21
hcyang1422
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2015-4-23
收藏
得分:0 
回复 9楼 renxiaoyao36
第一次GETDATA,得到的只是头包,后面还有多个包呢,该怎么处理才能把后面的数据也GETDATA,并和前面的包合在一起?
2015-04-23 20:13
快速回复:VB winsock接收数据处理的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.038159 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved