Итак, я пытаюсь использовать Named Pipes для связи между сервером C# и клиентом C++ .dll, который я буду вводить. Мои именованные каналы отлично работают при использовании с консольным приложением C++, но когда я использую тот же метод в .dll, сервер и клиент подключаются нормально, но когда я пытаюсь использовать NamedPipeServerStream.Write(), мое приложение C# замораживается. Они оба x64, если это вообще имеет значение.Именованные каналы C# Сервер C++ .dll Клиент не работает?
Любые идеи относительно того, почему?
C# Сервер
Thread ServerThread;
private static NamedPipeServerStream _server;
private void Form1_Load(object sender, EventArgs e)
{
ServerThread = new Thread(ServerThreadSub);
ServerThread.Start();
}
void ServerThreadSub()
{
while (true)
{
_server = new NamedPipeServerStream("ConsolePipe", PipeDirection.Out, 1, PipeTransmissionMode.Message);
_server.WaitForConnection();
do
{
} while (_server.IsConnected);
_server.Close();
}
}
private void text_CurrentCommand_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Return)
{
if (text_CurrentCommand.Text != "")
{
if (_server.IsConnected)
{
try
{
byte[] buff = Encoding.UTF8.GetBytes(text_CurrentCommand.Text);
_server.Write(buff, 0, buff.Length); //Freezes here
}
catch
{
Log("Client Disconnected, Command Not Processed.");
}
}
else
{
Log("Command Not Processed. Client Not Connected.");
}
}
e.SuppressKeyPress = true;
}
}
C++ Клиент
#define PIPE_NAME L"\\\\.\\pipe\\ConsolePipe"
#define BUFF_SIZE 1024
HANDLE hPipe;
DWORD WINAPI Main(LPVOID threadArgs)
{
while (true)
{
do
{
Sleep(1000);
hPipe = CreateFile(PIPE_NAME, GENERIC_READ, 0, nullptr, OPEN_EXISTING, 0, nullptr);
if (hPipe == NULL || hPipe == INVALID_HANDLE_VALUE) DeleteFile(PIPE_NAME);
} while (hPipe == NULL || hPipe == INVALID_HANDLE_VALUE);
DWORD mode = PIPE_READMODE_MESSAGE;
SetNamedPipeHandleState(hPipe, &mode, nullptr, nullptr);
bool success = false;
DWORD read;
while (true)
{
char chBuff[BUFF_SIZE];
success = ReadFile(hPipe, chBuff, (DWORD)strlen(chBuff), &read, nullptr);
if (success)
{
}
if (!success) break;
}
}
return 0;
}
Также другой запрос у меня есть, что это на самом деле не важно, есть ли способ, чтобы получить NamedPipeServerStream.IsConnected обновить без выполнения Read () или Write()?
Спасибо заранее с:
Использование функции strlen (chBuff) в вызове ReadFile() неверно, что генерирует полностью случайное число. Вместо этого используйте BUFF_SIZE. –
Хорошо, я попробую это c: – Semyel
Это сработало, спасибо вам большое! c: – Semyel