0

我有一个 WiFi 侦听器注册为具有固定第 3 方接口的回调(指针函数)。我使用函数的静态成员来注册回调函数,然后该静态函数通过静态强制转换调用非静态成员。主要问题是我无法与班级的任何成员接触生成的 char * buff,我什至无法更改也是班级成员的 int 标志。所有都会导致运行时访问冲突。我能做些什么?请在下面查看我的一些代码。其他问题在代码后说明。

void *pt2Object;

TextWiFiCommunication::TextWiFiCommunication()
{
    networkDeviceListen.rawCallback = ReceiveMessage_thunkB;
    /* some other initializing */
}

int TextWiFiCommunication::ReceiveMessage_thunkB(int eventType, NETWORK_DEVICE    *networkDevice)
{
     if (eventType == TCP_CLIENT_DATA_READY)
            static_cast<TextWiFiCommunication *>(pt2Object)->ReceiveMessageB(eventType,networkDevice);
     return 1;
}
int TextWiFiCommunication::ReceiveMessageB(int eventType, NETWORK_DEVICE *networkDevice)
{
     unsigned char outputBuffer[8];
// function from an API that reads the WiFi socket for incoming data
     TCP_readData(networkDevice, (char *)outputBuffer, 0, 8);
     std::string tempString((char *)outputBuffer);
     tempString.erase(tempString.size()-8,8);  //funny thing happens the outputBuffer is double in size and have no idea why
     if (tempString.compare("facereco") == 0)
         cmdflag = 1;
     return 1;
 }

因此,在运行时没有访问冲突的情况下,我无法更改变量 cmdflag。我不能将 outputBuffer 声明为类成员,因为没有写入任何内容,因此我必须在函数中执行此操作。我无法将 outputBuffer 复制到我班级的字符串类型成员。调试器向我展示了 strlen.asm 代码。不知道为什么。我怎样才能解决这个问题?我似乎被囚禁在ReceiveMessageB这个函数中。

提前致谢!

其他一些奇怪的问题包括:即使我将缓冲区大小称为 8。当我使用 outputBuffer 并用它初始化一个字符串时,该字符串的大小为 16。

4

1 回答 1

1

您可能会遇到访问冲突,因为 p2tObject 未指向有效对象,而是指向垃圾。p2tObject 什么时候初始化?它指向什么?

为此,您的代码应如下所示:

...
TextWifiCommunication twc;
p2tObject = reinterpret_cast<void*>(&twc);
...

关于字符串错误, TCP_readData 不太可能以空值终止您给它的字符数组。C 字符串在第一个 '\0'(空)字符处结束。当您将 C 字符串转换为 std::string 时,std::string 会从 C 字符串指针复制字节,直到找到空终止符。在您的情况下,它恰好在 16 个字符之后找到它。

要从 TCP 字节流中读取最多 8 个字符,缓冲区应为 9 个字符长,并且缓冲区的所有字节应初始化为 '\0':

...
unsigned char outputBuffer[9] = { 0 };
// function from an API that reads the WiFi socket for incoming data
TCP_readData(networkDevice, (char *)outputBuffer, 0, 8);
std::string tempString((char *)outputBuffer);
...
于 2012-09-01T04:10:21.670 回答