Я хочу реализовать сервер / клиент, используя именованные каналы (для IPC). Я использую асинхронные (перекрытые) соединения и порт завершения ввода / вывода (я много искал, и кажется, что это наиболее эффективный способ сделай это).
Сначала вот коды:
сервер: http://pastebin.com/XxeXdunC
и клиент: http://pastebin.com/fbCH2By8
Проблема в сервере (я могу улучшить клиента, но я сделаю это, когда сервер будет работать).
Я использую порт завершения ввода / вывода следующим образом: в основном, я запускаю поток, в котором я вызываю ReadFile (). Если он возвращает TRUE, я получаю все данные, если он возвращает FALSE, и ошибка ERROR_IO_PENDING, я жду с GetQueuedCompletionStatus ().
Что странно, даже если я прочитал все данные, последний вызов ReadFile () завершился неудачно, и ошибка ERROR_IO_PENDING
Поток, в котором я вызываю ReadFile (), является строкой 64 кода сервера.
Клиент отправляет 24 байта (строка «salut, c'est le client!»), А буфер ReadFile () имеет длину 5 байтов (чтобы проверить, как мой сервер обрабатывает данные, которые больше, чем буфер Readfile () )
Вывод:
waiting for client...
WaitForMultipleObjects : 0
client connected (1)
ReadFile 1 msg (5 -> 05) : salut
ReadFile 2 msg (5 -> 10) : salut, c'e
ReadFile 2 msg (5 -> 15) : salut, c'est le
ReadFile 2 msg (5 -> 20) : salut, c'est le clie
ReadFile 2 msg (4 -> 24) : salut, c'est le client !
ReadFile2: ERROR_IO_PENDING
GQCIOS 0 255 003D3A18
ReadFile3: ERROR_IO_PENDING
ReadFile1: ERROR_IO_PENDING
GQCIOS 5 255 003D3A2C
ReadFile3: ERROR_IO_PENDING
ReadFile1: ERROR_IO_PENDING
GQCIOS 5 255 003D3A2C
ReadFile3: ERROR_IO_PENDING
ReadFile1: ERROR_IO_PENDING
GQCIOS 5 255 003D3A2C
ReadFile3: ERROR_IO_PENDING
ReadFile1: ERROR_IO_PENDING
GQCIOS 5 255 003D3A2C
ReadFile3: ERROR_IO_PENDING
ReadFile1: ERROR_IO_PENDING
GQCIOS 4 255 003D3A2C
ReadFile3: ERROR_IO_PENDING
ReadFile1: ERROR_IO_PENDING
Что я не понимаю, так это то, что даже если я прочитал все данные, ReadFile () все еще возвращает ожидающую операцию (это сообщение об ошибке «ReadFile2: ERROR_IO_PENDING» после последнего вывода «msg»)
Мой цикл неправильный? Неправильно ли я использую ReadFile () / GetQueuedCompletionStatus ()?
спасибо