Следующий код зависает навсегда, когда вызывается GetOverlappedResult, у меня нет большого опыта в операциях асинхронного ввода-вывода Windows, я реализовал его в соответствии с моим пониманием. Я использовал его для доступа к интерфейсу виртуальной сети (через openvpn — интерфейс TAP / TUN, драйвер ядра которого установлен правильно).
Я нашел место, где он висит, но я не знаю причину, по которой он висит?
nread = 0;
memset(data_buffer, '\0', nread);
OVERLAPPED overlapped_read;
memset(&overlapped_read, 0, sizeof(overlapped_read));
overlapped_read.Offset = 0;
overlapped_read.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
if ( ReadFile(fd, data_buffer, len, &nread, &overlapped_read) == false ) {
if (GetLastError() != ERROR_IO_PENDING) {
std::cerr << "ReadFile failed : " << GetLastError() << std::endl;
return false;
}
else {
DWORD dwRes = WaitForSingleObject(overlapped_read.hEvent, INFINITE);
if(dwRes == WAIT_OBJECT_0) {
if (!GetOverlappedResult(fd, &overlapped_read, &nread, FALSE)) {
std::cout << "GetOverlappedResult failed : ErrorCode = "<< GetLastError() << std::endl;
CloseHandle(overlapped_read.hEvent);
return false;
}
else {
std:cout << "Read successfull." << std::endl;
}
}
else {
std::cout << "WaitForSingleObject failed : ErrorCode = "<< GetLastError() << std::endl;
CloseHandle(overlapped_read.hEvent);
return false;
}
}
std::cout << "bytes read = " << nread << std::endl;
CloseHandle(overlapped_read.hEvent);
return TRUE;
}
Вышеупомянутый код выполняется в бесконечном цикле while внутри потока, созданного с помощью API CreateThread.
Правильно ли реализована асинхронная операция?
Какие могут быть возможные случаи, когда GetOverlappedResult зависает?
PS: Несколько вызовов ReadFile были успешными, он может успешно прочитать кадр Ethernet, но зависает после прибл. 15-20 звонков.
Задача ещё не решена.