我有关于套接字的问题,在一次发送到套接字
中发送多个十六进制详情如下:
Private Sub sendACK()
Dim msgACK As String
Dim sendBytes As Byte()
tmpStr = ""
list.Clear()
msgACK = "33CC"
For j = 1 To Len(msgACK)
list.Add(Mid(msgACK, j, 2))
j += 1
Next
For Each tmpStr In list
sendBytes = HexToBytes(tmpStr)
clientSocket.BeginSend(sendBytes, 0, sendBytes.Length, SocketFlags.None, New System.AsyncCallback(AddressOf OnSend), clientSocket)
Next
End Sub
Public Function HexToBytes(ByVal s As String) As Byte()
Dim bytes As String() = s.Split(" "c)
Dim retval(bytes.Length - 1) As Byte
For ix As Integer = 0 To bytes.Length - 1
retval(ix) = Byte.Parse(bytes(ix), System.Globalization.NumberStyles.HexNumber)
Next
Return retval
End Function
Private Sub OnSend(ByVal ar As IAsyncResult)
clientSocket = ar.AsyncState
clientSocket.EndSend(ar)
Thread.Sleep(100)
End Sub
==>列为arraylist
该代码将是结果:
套接字发送33
结束发送
套接字发送CC
结束发送
============================
该程序应该像这样一次发送:
套接字发送33 CC
结束发送
============================
是否有任何关于将字符串“33CC”转换为字节的想法,然后该程序只是在“为每个”的“outter”中发送1次?
感谢阅读和回答.... GBU
答案 0 :(得分:1)
您的假设不正确。它确实一次发送两个字节。你只调用BeginSend
一次并且你给它两个字节,所以如果它在另一端接收它们,那么它确实发送它们。实际上,单独发送它们或将它们一起发送之间没有任何区别。由于套接字作为流工作,因此发送的每个字节之间的时间长度基本上无关紧要。接收端无法知道这两个字节是一起发送还是分开发送。所有接收端都知道这两个字节是按该顺序发送的。如果您想它们在接收端被作为两个单独的“发送”发送,听起来您正在对如何从套接字读取数据做出一些无效的假设。
但是,我应该提一下,通过首先创建一个十六进制字符串然后解析它来发送字节的方式有点傻。如果你需要将它解析为一个字符串,因为你正在从文本文件中读取十六进制值,或者某些东西,那很好,但除此之外,你应该只在代码中使用十六进制字节文字而不是字符串,例如:
Dim sendBytes As Byte() = {&H33, &HCC}