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" + '\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%08lx\n"), GetLastError());
return false;
}
_tprintf(_T("Sends %ld bytes; Message: \"%s\"\n"),
cbBytesWritten, chRequest);
return true;
}
после запуска первого файла записи (в случае ‘8’) другая функция файла записи работает неправильно, может кто-то понять, почему?
функция sendMessageToGraphics должна отправлять ход на шахматную доску
В вашем коде 2 проблемы:
Прежде всего, есть (незначительная) проблема, когда вы инициализируете строку в вашем условном выражении. Вы инициализируете это так:
string answer = "0" + '\0';
Это не делает то, что вы думаете, что делает. Это вызовет operator+
с помощью const char*
а также char
в качестве типов аргументов. Это выполнит добавление указателя, добавив значение '\0'
где хранится ваша константа. поскольку '\0'
будет преобразовано в целочисленное значение 0
, это ничего не добавит к константе. Но ваша строка в конечном итоге не имеет '\0'
терминатор. Вы можете решить эту проблему, изменив утверждение на:
string answer = std::string("0") + '\0';
Но настоящая проблема заключается в том, как вы используете переменные размера. Сначала вы инициализируете переменную размера для длины строки входной переменной (включая завершающую '\0'
персонаж). Затем в вашем условном выражении вы создаете новую строку, которую вы передаете WriteFile
Тем не менее, вы все еще используете оригинальный размер. Это может вызвать переполнение буфера, что является неопределенным поведением. Вы также устанавливаете переменную размера равной количеству байтов, которые вы записали в файл. Затем вы снова используете это же значение в следующем вызове. Вы никогда не проверяете это значение, так что это может вызвать проблемы.
Самый простой способ изменить это — убедиться, что ваши размеры установлены правильно. Например, вместо первого вызова вы можете сделать это:
WriteFile(hPipe, request, answer.size(), &cbBytesWritten, NULL);
Затем проверьте возвращаемое значение WriteFile
и значение cbBytesWritten
прежде чем сделать следующий звонок WriteFile
Таким образом, вы знаете, что ваш первый звонок также был успешным.
Также не забудьте убрать свой sizeof(TCHAR)
участие в расчете вашего размера. Вы никогда не используете TCHAR
в вашем коде. Ваш вклад является регулярным char*
как и строка, которую вы используете в вашем условном выражении. Я бы тоже советовал заменить WriteFile
от WriteFileA
чтобы показать, что вы используете такие символы.
И наконец, убедитесь, что ваш сервер действительно читает байты из дескриптора, в который вы пишете. Если ваш сервер не читает с дескриптора, WriteFile
функция будет зависать до тех пор, пока не сможет снова написать в дескриптор.
Других решений пока нет …