当前位置:编程学习 > VB >>

网络报文来不及处理的问题

(一)先讲一下程序相关背景:
嵌入式装置和PC机之间用网络连接,采用TCP方式通讯,嵌入式装置作服务器,PC机作客户端。
两端链路已经通讯完好。PC机的客户端程序是VB环境编写。
 
嵌入式录波装置<---->PC机客户端

客户端用了Winsock控件,网络接收数据是放在下面的Sub中:
Private Sub tcpClient_DataArrival(ByVal bytesTotal As Long)
收到的数据放在数组recTcpData()中:
Global recTcpData() As Byte      'winsock控件接收数据缓冲
MDIMain.tcpClient.GetData recTcpData
……
完整的过程是这样的:
Private Sub tcpClient_DataArrival(ByVal bytesTotal As Long)
  Dim i, j As Integer  
  i = MDIMain.tcpClient.BytesReceived  
  ReDim recTcpData(i)
  '读取Winsock端口数据
  If MDIMain.tcpClient.State = sckConnected Then
     MDIMain.tcpClient.GetData recTcpData 
  End If
End Sub

处理接收数据我是放在Timer控件中(Timer控件和Winsock控件都放在窗体MDIMain.frm中)。
Timer控件的Name为:XCTimer
Timer控件的Interval设为100: MDIMain.XCTimer.Interval = 100
下面是处理数据了:
Private Sub XCTimer_Timer()
  Call DealTCPData                      '''''20080325 此函数展开所有的分析报文工作
End Sub

Sub DealTCPData() 
    (此处声明各变量) 
    Select Case recTcpData(33)
        Case 1:
            'MsgBox ("处理测量数据")
(此处调用函数Call showYCData)
        Case 2:
            'MsgBox ("收到消息事件") 
(此处调用函数)
Case 3:
            'MsgBox ("收到呼吸报文")
(此处调用函数)
Case 43: 
            'MsgBox ("处理波形列表")
(此处调用函数)
(其他Case语句)
    End Select
    Call MyDelay(100)  
End Sub

(二)但是现在有这样的问题了:
1、比如说:Case 43: 'MsgBox ("处理波形列表"),服务器通过网络给PC客户端发送波形数据(比如说分两包),我在Sub tcpClient_DataArrival中设断点看,recTcpData(33)确实能收到43两次!每次客户端去要(服务器端)波形,此处Sub都能收到。但是在Sub DealTCPData() 
中却不一定每次都能进Case 43: 分支(不单单是Case 43: 分支,其他Case分支也会出现这样的情况)。这是什么原因?
2、时间控件中的函数报文是不是来不及处理,也就是说Call DealTCPData中处理接收数据缓冲recTcpData()的时候,缓冲有可能被Sub tcpClient_DataArrival中的覆盖了?
3、我的程序架构是基于这样的思想:接收数据只负责接收,即放在Sub tcpClient_DataArrival中;处理数据放在时间控件中循环处理,即放在Private Sub XCTimer_Timer()中。之所以这样做,是因为我在做服务器端的时候,网络接收数据就是在底层驱动中做的,应用层也象Case语句一样处理,这样,收报文与分析报文相对独立,不会混乱,对应用层来讲,底层就提供给一个收数据函数和一个发数据函数,收数据的时候,应用层调用收数据函数,接下来只管分析缓冲数组即可;发数据的时候,应用层也只需把缓冲数组组织好,然后调用发数据函数即可。但是在PC客户端,我这样的机制是否有问题?但是问题出在哪里呢?
4、tcpClient_DataArrival是否就相当于硬件中的中断的接收么?
5、处理数据(函数)是否可以放在tcpClient_DataArrival中?是不是网络数据一来,函数 Sub tcpClient_DataArrival(ByVal bytesTotal As Long)就会执行?如果是的话,假如函数中的语句几万条几十万条,程序来不及处理怎么办?会不会出现这样的情况?怎么知道这样的情况出现了?出现了怎么办? 
6、如果我的机制没有问题,又如何设置XCTimer.Interval?多大的间隔能处理多少函数(语句)? 
7、时间控件多大的间隔能匹配TCP收数据(tcpClient_DataArrival)的速度? 
8、假如时间控件里只有一个函数任务。有没有这样的情况:网络开始没报文,时间控件还是在处理,轮到一半的时间,这时候网络来报文了,收数据缓冲有内容了,时间控件继续处理,但是分析数据就有可能误进其他分支;时间控件中函数很多呢?我觉得更容易产生问题。哎,整个过程的本质我还是没怎么弄明白。
9、各位大虾对于网络收发数据以及处理是如何架构的?
10、我的QQ:471501765,渴望大家的指点和交流。
--------------------编程问答-------------------- 帮顶 --------------------编程问答-------------------- 谢谢帮我顶上去 --------------------编程问答-------------------- 感觉你的DealTCPData处理效率比较低,应该是你在一个时间间隔内,不能处理完你收到的数据,以至于影响了下次的接收。 --------------------编程问答-------------------- 建议用两个线程或进程,一个为网络客户端,专门负责从套接字中接收内容,并用一个动态数组(模拟链表)缓存接收内容,另一个专门负责解析和处理,如果是进程,二者之间可以使用postmessage和peekmessage进行通讯。postmessage传递参数时,除了自定义的消息码之外,还要把缓冲区的指针传递过去,然后解析和处理的程序采取读取远程内存指针的办法读取内容,并发送处理完毕的消息,告知网绞络客户进行该内存块的释放。如果是线程,则更好办了,可以使用事件对象同步。 --------------------编程问答-------------------- 大虾,您好。VB里面线程我没有用过。能说详细一点么?
引用 3 楼 CathySun118 的回复:
感觉你的DealTCPData处理效率比较低,应该是你在一个时间间隔内,不能处理完你收到的数据,以至于影响了下次的接收。
--------------------编程问答-------------------- 接收不影响吧?还是只是接收到的数据影响了处理报文的函数分支?
引用 2 楼 cpldfpga 的回复:
谢谢帮我顶上去
--------------------编程问答-------------------- 原因在于socket是异步的,而VB是线程阻塞运行的,如果处理不及时,肯定会丢失一些数据.因此建议用多线程或多进程,至用多线程的编程,网上有许多例子,我这几天太慢了,不能跟你详细的代码. --------------------编程问答-------------------- 多谢大虾。我再找找看
引用 6 楼 cpldfpga 的回复:
接收不影响吧?还是只是接收到的数据影响了处理报文的函数分支?引用 2 楼 cpldfpga 的回复:
谢谢帮我顶上去 
补充:VB ,  网络编程
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,