Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
В общем потестил. Как я и ожидал, всё работает так как надо... 27.08.07 12:15 Число просмотров: 2802
Автор: IgorR <Igor Razin> Статус: Member
|
В общем потестил. Как я и ожидал, всё работает так как надо и как должно работать. Твоих граблей вроде не наблюдается.
Сервер:
==================================================================
HANDLE hPipe = CreateNamedPipe( T("\\\\.\\PIPE\\IOCP_TEST"),
PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,
PIPE_UNLIMITED_INSTANCES,
1024, 1024,
NMPWAIT_WAIT_FOREVER, NULL );
CIOCP iocp;
iocp.Init();
iocp.AssociateDevice( hPipe, 123 /* key */ );
OVERLAPPED op = {0};
ConnectNamedPipe( hPipe, &op );
DWORD dwKey = 0;
DWORD dwBytes = 0;
LPOVERLAPPED pop = NULL;
// Ждем коннекта.
iocp.GetStatus( &dwKey, &dwBytes, &pop );
BYTE bData[1024] = {0};
// Отправим данные 2 раза, при этом клиент данные не читает.
// Первый раз вернется 1 - операция завершилась синхронно.
// Второй раз вернется 0 - асинхронно, т.к. клиент не вычитал первую партию.
ZeroMemory( &op, sizeof( op ) );
DWORD dwRet = WriteFile( hPipe, bData, 1024, NULL, &op ); // 1
DWORD dwError = GetLastError();
ZeroMemory( &op, sizeof( op ) );
dwRet = WriteFile( hPipe, bData, 1024, NULL, &op ); // 0
dwError = GetLastError();
// Завершенка на первую посылку будет сразу.
iocp.GetStatus( &dwKey, &dwBytes, &pop );
// Ждем пока клиент прочтет 1-ю партию.
// Если сейчас вырубить клиента, то завершенка ПРИДЕТ.
iocp.GetStatus( &dwKey, &dwBytes, &pop );
iocp.Release();
CloseHandle( hPipe );
==================================================================
Клиент:
==================================================================
HANDLE hPipe = CreateFile( T("\\\\.\\PIPE\\IOCP_TEST"),
GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL );
/*
BYTE bBuffer[1024] = {0};
DWORD dwRead = 0;
ReadFile( hPipe, bBuffer, 1024, &dwRead, NULL );
ReadFile( hPipe, bBuffer, 1024, &dwRead, NULL );
*/
CloseHandle( hPipe );
==================================================================
|
|
|