2015-12-19 7 views
0
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 нужно отправить перейти на шахматной доскеdo writefile function double

+0

* Как * не работает ли «правильно»? Что происходит, когда вы вызываете функцию во второй раз? Как вы называете функцию 'sendMessageToGraphics'? Почему бы вам не проверить результат первого вызова «WriteFile»? –

+0

во второй раз его не доходит до конца (часть _tprintf), его просто вернется к функции, которая называется sendMessageToGraphics – ronbob

+0

О, а вместо того, чтобы делать, например, '* msg - '8' == 0' не было бы проще (и более« читаемым »), если бы вы это сделали. 'msg [0] == '8''? –

ответ

1

Есть 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 замерзнет, ​​пока она не сможет снова записать в дескриптор.