下面有一个代码片段来处理套接字消息,我想知道发送的消息应该是什么,以免导致返回。
其中SocketPacket是存储接收套接字的类,DataLength是接收消息的长度,dataBuffer存储消息。
int num3;
byte num6 = 0;
SocketPacket workSocket;
int DataLength;
if (workSocket.dataBuffer[0] == 0x33)
{
if (DataLength < 0xbb)
{
return false;
}
for (num3 = 0; num3 < 0xba; num3++)
{
num6 = (byte) (num6 + workSocket.dataBuffer[num3]);
}
// how to get pass this if condition??
if (num6 != workSocket.dataBuffer[0xba])
{
return false;
}
}
所以,
workSocket.dataBuffer[0 or 1 or any int]
转换为可读字符串。 Convert.ToChar(workSocket.dataBuffer[0])
和workSocket.dataBuffer[0].toString()
会得到不同的结果。那是为什么?答案 0 :(得分:0)
那么,你有一个固定长度的消息(一个187字节的消息)。第一个字节是标记,用于标识消息的开头,如果第一个字节不是0x33,那么您的代码不会处理缓冲区中的字节。
接下来,在For语句中,您有校验和。它正在添加所有前186个字节,以便将结果与最后一个字节进行比较(预先计算的校验和)。它是验证消息是否正常(顺便说一下,因为协议保证流/数据报是可靠的)。
所以,关于你的问题:
要发送给服务器的消息是什么,以便通过最后一个条件?
好吧,你需要发送187字节长的消息(只是一个字节[187]):第一个必须是0x33,接下来是内容,最后一个必须是校验和(你应该在您的代码段显示相同的方式)
[0x33 | THE CONTENT | CHKSUM]
0 1 185 186
例如:以下缓冲区具有有效消息(将传递if条件的消息)。它只是以标记字节(0x33)开始,接下来的185个字节为零(我没有分配值)然后,校验和为0x33 + 0 + 0 + 0 + 0 ... 0 ... = 0x33
var buffer = new byte[187];
buffer[0] = 0x33;
buffer[186] = 0x33;
什么是0xba,0x33,0xbb等......?十六进制数吗
是的,它们只是十六进制的数字。
我试图转换(原文如此)给出了不同的结果。为什么?
套接字发送/接收字节(只是数字),但真正的问题是:为什么你认为它们必须是文本?可能他们是文本,是的,但谁知道。这是两个端点达成一致并允许它们交换数据的协议(协议)的一部分。所以,你必须知道185个字节(标记为187 - 1个字节 - 1个字节校验和)的意思是为了能够处理它们。
现在,您正在做的是协议的逆向工程,因为很明显您不知道消息格式,我想您不知道内容含义是什么,以及即使你是对的,内容只是文本,你也会忽略使用的编码。这些是你需要关注的事情。
我希望这会对你有所帮助。