У меня есть процессы клиент-сервер, и когда я пытаюсь подключиться в первый раз, все в порядке, но когда я снова запускаю свой клиентский процесс, не перезагружая сервер, я не могу подключиться с ошибкой PIPE_BUSY, хотя GetOverlappedResult успешно работает на сервере, но waitforsingleobject не сигнализирует, что кто-то подключен, и сообщение, конечно, пусто.Именованная труба не может подключиться во второй раз
std::wstring buffer;
while (true) {
// pinging here...
DWORD result = WaitForSingleObject(hEvent, 2000);
if (result == WAIT_FAILED) {
std::wcout << result << std::endl;
break;
}
if (result == WAIT_TIMEOUT) {
// always here
}
ResetEvent(hEvent);
DWORD bytesTransferred;
OVERLAPPED ov;
ZeroMemory(& ov, sizeof(OVERLAPPED));
ov.hEvent = hEvent;
if (GetOverlappedResult(pipe(), & ov, & bytesTransferred, TRUE) == 0) // FAILED
{
return; // we do never get here...
} else {
ZeroMemory(& ov, sizeof(OVERLAPPED));
DWORD bytesToRead = 0;
BOOL pingPipe;
Timer timer(1000);
while (!bytesToRead || !pingPipe) {
if (!timer.in()) {
break;
}
pingPipe = PeekNamedPipe(pipe(), NULL, 0, NULL, & bytesToRead, NULL);
}
buffer.resize(sizeof(TCHAR) * bytesToRead);
if (!ReadFile(pipe(), & buffer[0], bytesToRead, & bytesTransferred, & ov) && timer.in()) {
if (GetLastError() == ERROR_IO_PENDING) {
continue;
}
return;
}
// data here
std::wcout << buffer << std::endl;
}
}
DisconnectNamedPipe(pipe());
В вашем сообщении отсутствует код ключа (который я предполагаю, это фрагмент случайного бита конца серверной части?). Пожалуйста, создайте и опубликуйте [полный пример] (http://sscce.org/). При этом вы можете обнаружить эту проблему, но по минимуму вы предоставите необходимую информацию для других, чтобы помочь. –
вызов 'GetOverlappedResult' убивает асинхронную логику – RbMm
Это говорит о том, что я подозреваю ваше непонимание« GetOverlappedResult », и ваша случайная упаковка вашей структуры« OVERLAPPED »с« hEvent »является основной проблемой, а также вы фактически не запускаете надлежащую операцию перекрытия (вы не просто заполняете свой собственный «OVERLAPPED», вы должны получить его, например, с помощью «ReadFile», который заполнит дескриптор события и такой * для * вас), где событие, по-видимому, запускается при входящем соединении, фактически блокируя «GetOverlappedResult», пока кто-то не попытается подключиться или что-то в этом роде. –