C#将十六进制字符串发送到tcp套接字

时间:2013-09-29 10:11:47

标签: c# sockets stream request

我正在尝试将十六进制字符串发送到tcp套接字。我对这个字符串的格式或转换有一些问题,因为我不太确定它使用的格式是什么。

我编写了一个基于Socket Class的WindowsPhone应用程序。 此应用程序模拟请求,这些请求通常从桌面程序发送到托管Web服务的设备。

通过wireshark,我发现,webservice将接受一个输入流(以十六进制表示)并返回第二个。十六进制流,包含我需要的数据。

因此桌面应用程序正在发送流 和Wireshark显示时间:

数据(8个字节) 数据:62ff03fff00574600 长度:8

现在我已经尝试了很多来重现这个流。我认为,它曾经是一个UTF8字符串,并将此流转换为此格式。但每次发送时,都会在Wireshark中看到以下输出:62c3bf03c3bf00574600

据我所研究62 = b但ff总是发送c3bf。

有人知道如何以正确的格式发送此流吗?

干杯, 乔

2 个答案:

答案 0 :(得分:0)

套接字传输不应该关心,TCP数据包的内容是二进制代表“什么”。 从您在评论中指出的代码:

byte[] payload = Encoding.UTF8.GetBytes(data);
socketEventArg.SetBuffer(payload, 0, payload.Length);
...
response = Encoding.UTF8.GetString(e.Buffer, e.Offset, e.BytesTransferred);
response = response.Trim('\0');

在套接字发送/接收结束时(data == response)。如果没有发生这种情况,您需要确定问题所在。第一步是编写一些非常简单的代码,如下所示:

string source = "your problem text string";
byte[] encode = Encoding.UTF8.GetBytes(source);
target = Encoding.UTF8.GetString(encode, 0, encode.Length);
Debug.Assert(source == target);

如果可行,则输出'encode'数组可以检查以确保它包含在发送它的数据包数据中,然后验证这是正在接收的内容。如果你正在发送正确的数据,但收到它已损坏你有严重的问题...我怀疑你发现但是如果是这样的话写一个非常简单的测试程序,在同一台机器上发送和接收(localhost),看看它是否可重复。

如果我不得不猜测我会说正在编码的字符不是Unicode或者Win手机没有正确支持它(Proper unicode support)。

答案 1 :(得分:0)

只要您不知道服务器期望的协议/编码,您就只能重播已知消息,例如您在问题中提供的字节。

因此,您只需直接定义字节数组,如下所示:

byte[] payload = new byte[] {0x62, 0xff, 0x03, 0xff, 0xf0, 0x05, 0x74, 0x60};

并将其发送到套接字,就像之前使用编码字符串一样。服务器现在应该接受您嗅探的客户端发送的消息。