C# 识别套接字消息
下面我有一个处理套接字消息的代码片段,我想知道为了不导致返回,应该发送什么消息 其中SocketPacket是存储接收到的套接字的类,DataLength是接收到的消息的长度,dataBuffer存储消息C# 识别套接字消息,c#,sockets,bytebuffer,C#,Sockets,Bytebuffer,下面我有一个处理套接字消息的代码片段,我想知道为了不导致返回,应该发送什么消息 其中SocketPacket是存储接收到的套接字的类,DataLength是接收到的消息的长度,dataBuffer存储消息 int num3; byte num6 = 0; SocketPacket workSocket; int DataLength; if (workSocket.dataBuffer[0] == 0x33) { if (DataLength < 0xbb) {
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;
}
}
intnum3;
字节num6=0;
SocketPacket工作socket;
int数据长度;
if(工作组数据缓冲[0]==0x33)
{
if(数据长度<0xbb)
{
返回false;
}
对于(num3=0;num3<0xba;num3++)
{
num6=(字节)(num6+workSocket.dataBuffer[num3]);
}
//如果条件允许,如何通过此测试??
if(num6!=工作组数据缓冲区[0xba])
{
返回false;
}
}
所以
workSocket.dataBuffer[0或1或任何int]
转换为可读字符串Convert.ToChar(workSocket.dataBuffer[0])
和workSocket.dataBuffer[0].toString()
给出了不同的结果。为什么呢好的,这里有一条固定长度的消息(187字节的消息)。第一个字节是标识消息开头的标记,如果第一个字节不是0x33,则代码不处理缓冲区中的字节 接下来,在For语句中有一个校验和。它将所有前186个字节相加,以便将结果与最后一个字节(预先计算的校验和)进行比较。这是为了验证消息是否正常(顺便说一句,这是无用的,因为协议保证流/数据报正常) 那么,关于你的问题: 要向服务器发送什么消息才能通过最后一个if条件? 好的,您需要发送187字节长的消息(简单地说是一个字节[187]):第一个必须是0x33,接下来是内容,最后一个必须是校验和(您应该以代码段显示的相同方式计算) 例如:以下缓冲区有一条有效消息(将通过if条件的消息)。它只是从标记字节(0x33)开始,接下来的185个字节是零(我没有赋值),然后校验和是0x33+0+0+0+0。。。0 ... = 0x33
var buffer = new byte[187];
buffer[0] = 0x33;
buffer[186] = 0x33;
什么是0xba、0x33、0xbb等。。。。?十六进制?
是的,它们只是十六进制的数字
我尝试转换(sic)得到不同的结果。为什么会这样?
套接字发送/接收字节(只是数字),但真正的问题是:为什么您认为它们必须是文本?可能是文字,但谁知道呢。这是协议(协议)的一部分,两个端点都同意并允许它们交换数据。所以,为了能够处理它们,您必须知道这185个字节(187-1字节表示mark-1字节校验和)意味着什么
现在,你正在做的是一个协议的逆向工程,这是因为很明显你不知道消息格式,我猜你不知道内容的含义是什么,即使你是对的,内容只是文本,你也忽略了使用的编码。这些是你需要关注的事情
我希望这对您有所帮助。我已经编辑了您的标题。请看“”,其中的共识是“不,他们不应该”。谢谢!是的,我正在尝试对某个程序的输入消息进行反向工程。对于那些不知道自己的意思的
0x33
或0x76
或0xc000000
的人,我真的很困惑
var buffer = new byte[187];
buffer[0] = 0x33;
buffer[186] = 0x33;