VB Raw TCP只读读取前5个字节

时间:2013-07-17 13:16:49

标签: vb.net stream tcpclient

我有一个带有以下函数的类,它打开与服务器的连接,向它发送一个原始的字节字符串,然后读取响应。响应长度为23个字节,我已经确认服务器通过在HyperTerminal中发送相同的初始消息并在那里查看响应来发送响应。

然而,使用VB.NET Windows窗体应用程序,保存到Response.Data中的数据只显示为5个字节长,然后连接超时(我有stream.ReadTimeout = 1000)...任何人都可以看到为什么这个可能是这样吗?

 Public Function sendCommand(command As String) As Boolean
        Dim lst As New List(Of Byte)()
        Dim buf(50) As Byte
        Dim numRead As Integer
        Dim ofst As Integer = 0

        lst.AddRange(Encoding.ASCII.GetBytes(command))  ' Convert the command string to a list of bytes
        lst.Add(&H4)    ' Add 0x04, 0x0A and a newline to the end of the list
        lst.Add(&HA)
        lst.AddRange(Encoding.ASCII.GetBytes(vbNewLine))
        buf = lst.ToArray   ' Convert the list to an array

        If Not makeConnection() Then    ' Make the connection (client & stream) and check if it can be read and written to.
            Return False
        End If

        stm.Write(buf, 0, buf.Length)   ' Write the array to the stream

        Try
            Do    
                numRead = stm.Read(buf, ofst, 5)  ' Try and read the response from the stream
                ofst += numRead
            Loop While numRead > 0
        Catch e As Exception
            MessageBox.Show(e.Message)
        End Try

        breakConnection()   ' Close the connection

        Response.Type = Type.Strng  ' Save the response data
        Response.Data = System.Text.Encoding.ASCII.GetString(buf, 0, ofst) 'Changed to ofst
        'Response.Type = Type.Int
        'Response.Data = numRead.ToString
        Return True
    End Function

UPDATE:我已经使用了一个范围来检查将响应数据提供给服务器的串行线 - 当我使用hyperTerm时,一切看起来都没问题,但奇怪的是,当我只运行VB时字符被送入服务器,就像服务器将串行线保持为高电平一样,以防止任何进一步的数据被发送到服务器。我需要查看服务器的设置,但我认为这仍然是我的VB的一个问题,因为它对HyperTerm来说没问题 - 是否有一些TCP确认动作或者我可能在VB中遗漏的东西? / p>

2 个答案:

答案 0 :(得分:1)

使用您发布的代码,Response.Data永远不会超过5个字节,因为这是stm.Read调用将分配给numRead的最大数字。我想你想要ofst(你可能需要在读取流之后而不是之前增加它)。

答案 1 :(得分:1)

我添加的ASCII 0x04字符代码字节是EOT字符。

TcpClient实际上表示传输结束,而不是将其作为原始字节以0x04作为终端客户端发送出去,而不是将其发送出去。

由于传输命令的方式,这意味着在第一个数据包中发送了足够的命令,以便服务器开始返回数据 - 即前5个字节。 但是EOT在第二个数据包中,所以服务器停止发送更多数据!!

Wireshark告诉我这个!