执行两次写入文件功能

do writefile function twice

本文关键字:文件 功能 两次 执行      更新时间:2023-10-16
bool sendMessageToGraphics(char* msg)
    {
        //char ea[] = "SSS";
        char* chRequest = msg;  // Client -> Server
        DWORD cbBytesWritten, cbRequestBytes;
        // Send one message to the pipe.
        cbRequestBytes = sizeof(TCHAR) * (lstrlen(chRequest) + 1);
        if (*msg - '8' == 0)
        {
            char new_msg[1024] = { 0 };
            string answer = "0" + '';
            copy(answer.begin(), answer.end(), new_msg);
            char *request = new_msg;
            WriteFile(hPipe, request, cbRequestBytes, &cbRequestBytes, NULL);
        }
        BOOL bResult = WriteFile(           // Write to the pipe.
            hPipe,                      // Handle of the pipe
            chRequest,                  // Message to be written
            cbRequestBytes,             // Number of bytes to writ
            &cbBytesWritten,            // Number of bytes written
            NULL);                      // Not overlapped 
        if (!bResult/*Failed*/ || cbRequestBytes != cbBytesWritten/*Failed*/)
        {
            _tprintf(_T("WriteFile failed w/err 0x%08lxn"), GetLastError());
            return false;
        }
        _tprintf(_T("Sends %ld bytes; Message: "%s"n"),
            cbBytesWritten, chRequest);
        return true;
    }

运行的第一个写文件之后(在"8"的情况下(,另一个写文件函数无法正常工作,有人能理解为什么吗?函数发送消息到图形需要发送移动到棋盘

代码中有 2 个问题:

首先,有一个(小(问题,即在条件语句中初始化字符串。您可以按如下方式初始化它:

string answer = "0" + '';

这不会做你认为它做的事情。它将使用 const char*char 作为其参数类型调用operator+。这将执行指针添加,将 '' 的值添加到常量的存储位置。由于''将被转换为整数值0,它不会向常量添加任何东西。但是您的字符串最终没有''终止符。您可以通过将语句更改为:

string answer = std::string("0") + '';

但真正的问题在于你使用大小变量的方式。首先将 size 变量初始化为输入变量的字符串长度(包括终止''字符(。然后在条件语句中创建一个传递给WriteFile的新字符串,但仍然使用原始大小。这可能会导致缓冲区溢出,这是未定义的行为。您还可以将 size 变量设置为写入文件的字节数。然后稍后在下一次调用中再次使用相同的值。您从未实际检查过此值,因此这可能会导致问题。

更改此设置的最简单方法是确保正确设置尺寸。例如,您可以执行以下操作,而不是第一次调用:

WriteFile(hPipe, request, answer.size(), &cbBytesWritten, NULL);

然后在下一次调用 WriteFile 之前检查返回值 WriteFilecbBytesWritten 的值,这样您就知道您的第一次调用也成功了。

另外,不要忘记在尺寸计算中移除sizeof(TCHAR)零件。您永远不会在代码中使用TCHAR。您的输入是常规char*您在条件中使用的字符串也是如此。我还建议用WriteFileA替换WriteFile,以表明您正在使用此类字符。

最后,确保您的服务器实际上正在从您写入的句柄中读取字节。如果服务器未从句柄读取,则WriteFile函数将冻结,直到它可以再次写入句柄。