识别套接字消息

时间:2014-04-26 04:30:32

标签: c# sockets bytebuffer

下面有一个代码片段来处理套接字消息,我想知道发送的消息应该是什么,以免导致返回。

其中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;
    }
}

所以,

  1. 发送给服务器的消息是什么,以便通过最后一个条件? (根据我的理解,信息的长度至少应为187,第一个数字应为“3:.........................” )
  2. 什么是0xba,0x33,0xbb等......?十六进制数?我该如何重新构建输入消息?将这些转换为ASCII?或.... dec?对我没有任何意义.......
  3. 我尝试将workSocket.dataBuffer[0 or 1 or any int]转换为可读字符串。 Convert.ToChar(workSocket.dataBuffer[0])workSocket.dataBuffer[0].toString()会得到不同的结果。那是为什么?

1 个答案:

答案 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个字节校验和)的意思是为了能够处理它们。

现在,您正在做的是协议的逆向工程,因为很明显您不知道消息格式,我想您不知道内容含义是什么,以及即使你是对的,内容只是文本,你也会忽略使用的编码。这些是你需要关注的事情。

我希望这会对你有所帮助。