У меня есть клиент и сервер, взаимодействующий по именованному каналу.
Я пытаюсь передать адрес, сохраненный переменной LPCWSTR, с клиента на сервер.
Для этого я сначала записываю адрес в буфер wchar_t, затем отправляю сервер размер этого буфера (как DWORD), так что теперь сервер знает, сколько байтов он должен прочитать. Мне удалось успешно отправить размер буфера, но я не могу отправить полную строку.
Несмотря на то, что сервер говорит, что он прочитал требуемое количество байтов, буфер на стороне сервера не имеет вся строка.
Клиент:
wchar_t msgBuffer[1024];
LPCWSTR lpName = L"NameString";
_swprintf(msgBuffer, _T("%p\0"), lpName); //Write data to the buffer
DWORD nBytesToWrite = wcslen(msgBuffer); //Number of bytes to be written
bWriteFile = WriteFile( //Send the buffer size
hCreateFile,
&nBytesToWrite,
(DWORD)sizeof(nBytesToWrite),
&dwNoBytesWritten,
NULL
);
bWriteFile = WriteFile( //Send the data
hCreateFile,
msgBuffer,
(DWORD)wcslen(msgBuffer),
&dwNoBytesWritten,
NULL
);
Сервер:
DWORD dwBytesToRead = 0;
bReadFile = ReadFile( //Read the size of the next message
hCreateNamedPipe,
&dwBytesToRead,
sizeof(DWORD),
&dwNoBytesRead,
NULL);
std::cout << "\nBytes to be read: " << dwBytesToRead;
wchar_t msg[] = L"";
bReadFile = ReadFile( //Read the data
hCreateNamedPipe,
&msg,
dwBytesToRead,
&dwNoBytesRead,
NULL);
std::cout << "\nBytes Read: " << dwNoBytesRead;// << '\n' << msg;
wprintf(L"\nMessage: %s\nSize: %zu", msg, wcslen(msg));
Это вывод на стороне сервера:
Байт для чтения: 9
Байт для чтения: 9
Сообщение: 78E7
Размер: 5
Адрес 78E7325C
на стороне клиента, но мой сервер печатает только 78E7
Несмотря на то, что сервер сообщает, что прочитал 9 байтов, размер результирующего wchar_t составляет всего 5, почему это так?
РЕДАКТИРОВАТЬ: Я проверил буфер на стороне клиента, он хранится в правильном адресе. И можно ли отправлять переменную DWORD с помощью оператора address-of (&) в WriteFile ()?
Решение
Изменено (DWORD)wcslen(nBytesToWrite)
на (DWORD)sizeof(nBytesToWrite)
wcslen
дает количество символов, тогда как sizeof
дает количество байтов, и они не совпадают.