2010-08-25 76 views
0

我有一个发件人,一个消息转发器,它以每个消息5毫秒的速率发送固定大小的字节数据到我用vb6编写的接收程序,当我运行消息fowarder和我的接收程序在一台机器上,没有问题,但是当它们在单独的机器上运行时,接收程序开始出现一些异常情况。服务器无法在vb6中顺利接收字节数据

例如:

private sub socket_DataArrival(index as integer, ByVal dataTotal as Long) 

Dim Data() as Byte 
Length.Text = dataTotal 

socket.GetData byteData, vbArray + vbByte 

If Length.Text = "100" Then 
txtOutput.Text = "Message1" 

ElseIf Length.Text = "150" Then 
txtOutput.text = "Message2" 

End Sub 

在它有250个字节或当我应该接收100或只有150,但如果非recognizeable字节大小我有时会收到“2合1”的消息我将发送速率降低到每个消息50毫秒的更慢的速度,那么它会没事的。

可以有什么建议吗?谢谢。

回答

0

当过你必须习惯这样的事实,数据包可以到达的顺序一个网络发送数据,不及时,一点都没有,等

你需要提高你的消息协议,包括一个标题指出了哪种类型的消息。如果顺序很重要,包括一个序列号(我假设你使用的是UDP)。目前,您正在依靠计时来分离邮件,而这些邮件在网络上无法使用。

缓冲所有到达的数据并以块处理 - 头允许您指出要使用的块大小。将输入缓冲区与消息处理分开 - 使用DataArrival事件将数据添加到缓冲区,使用Timer或其他方式轮询缓冲区以检查是否有消息可供分析。唉,这是VB6,所以线程并不那么容易。看看The Common Controls Replacement Project计时器对象DLL,如果您需要一个不依赖于UI元素存在的Timer类。

+0

TCP数据将按顺序到达。在“消息”之后,也可以使用分隔符代替标头。但是我看不出任何类型的定时器的任何理由。在DataArrival中,您只需将新数据附加到缓冲区,然后解析并处理任何完整的消息。 – Bob77 2010-08-25 17:52:39

+0

感谢您的建议,我使用TCP进行数据传输,我不确定是否可以使用分隔符,因为传入的字节不是字符串消息,而是稍后将相应地移出字节的数组的字节。从上面的例子来看,如果我收到250字节,可能有办法分割它,但有时它会以一些不规则的大小,如180 ...等等。如果我错了,请纠正我。谢谢。 – k80sg 2010-08-26 02:36:14

+0

对于二进制数据,你非常想要一个长度标题,正如上面已经提到的那样。 – Bob77 2010-08-28 02:05:30

相关问题