ReadFile (Клиентский конец именованного канала) Зависает — Win32 VStack Overflow

У меня есть следующий код как часть другого модуля, который отправляет сообщения клиенту. Это было для МПК. Два DLL загружены exe, и эти два должны общаться

В DLL-1 у меня есть следующая строка кода в качестве сервера именованного канала.

pipe = CreateNamedPipe("\\\\.\\pipe\\S2D8",PIPE_ACCESS_OUTBOUND | FILE_FLAG_OVERLAPPED /**1-way, send only with overlapped IO*/,
PIPE_TYPE_MESSAGE,1,0,0, 0, NULL);
if( INVALID_HANDLE_VALUE != pipe )
{
log("Created Named Pipe as Serverl\n");
}
else
{
log("Cannot create Named Pipe as Server\n");
}

И где-то еще в DLL-1 у меня есть следующее для сервера

bool result = ConnectNamedPipe(pipe, NULL);
if (!result)
{
CloseHandle(pipe); // close the pipe

}
else
{
DWORD numWritten;
WriteFile(pipe,KeyBoardBuffer,strlen(KeyBoardBuffer) * sizeof(char),&numWritten,0);
log("Bytes writtern to pipe:%d\n",numWritten);
}

Когда я смотрю на логи, я вижу, что именованный канал. Хорошо до сих пор.

В то время как в DLL-2 у меня есть следующее в качестве клиентской части

log("Connecting to named pipe at client\n");
if(pipe2 == NULL || pipe2 == INVALID_HANDLE_VALUE)
{

pipe2 = CreateFile("\\\\.\\pipe\\S2D8", GENERIC_READ ,
FILE_SHARE_READ | FILE_SHARE_WRITE,NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL);

if (pipe2 == INVALID_HANDLE_VALUE)
{
log("Cannot connect to named pipe at client%x\n", GetLastError());
CloseHandle(pipe2);
}
else
{
log("Connected to named pipe at client! Going to read!!!\n");
char buffer[256] = {'\0'};
DWORD numBytesRead = 0;
BOOL result = ReadFile(
pipe2,
buffer, // the data from the pipe will be put here
sizeof(buffer) * sizeof(char), // number of bytes allocated
&numBytesRead, // this will store number of bytes actually read
NULL // not using overlapped IO
);
if (result)
{
kbBuffer[numBytesRead / sizeof(char)] = '\0'; // null terminate the string
log( "Number of bytes read: %d\n",numBytesRead);
log(kbBuffer );
}
else
{
log("Failed to read data from the pipe.\n");
}
}
}

И в моих журналах я вижу строку «Подключение к именованному каналу на клиенте», а затем «Подключен к именованному каналу на клиенте!

Правильно ли задано соглашение об именах каналов? Или есть какие-то настройки безопасности, которые я должен определить?

Я использую VS2010, Win7 x64.

Любое руководство высоко ценится.

0

Решение

Вы вызываете неправильный метод. Предполагается, что канал уже существует, поэтому вы должны звонить OpenFile()не CreateFile(),

0

Другие решения

Ах, я нашел ответ на зависание, я должен был сделать PeekNamedPipe(pipe2, NULL, 0, NULL, &bytesAvailable, NULL); а затем проверьте, чтобы bytesAvailable было больше нуля, прежде чем я сделал ReadFile()

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector