访问作为WiFi侦听器回调成员函数一部分的类的成员



我有一个注册为回调(指针函数)的WiFi侦听器,具有固定的第三方接口。我使用函数的一个静态成员来注册回调函数,然后该静态函数通过静态强制转换调用一个非静态成员。主要的问题是,我不能用我的类的任何成员触摸得到的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。

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

为了实现这一点,您的代码应该如下所示:

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

关于字符串错误,TCP_readData不太可能以null终止您给它的字符数组。C字符串以第一个"\0"(null)字符结束。当您将C字符串转换为std::字符串时,std::string会从C字符串指针复制字节,直到找到null终止符。在您的情况下,它恰好在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);
...

最新更新