niektóre OVERLAPS używające WSASend nie zwracają się w odpowiednim czasie przy użyciu GetQueuedCompletionStatus?

Tło: Używam CreateIoCompletionPort, WSASend / Recv i GetQueuedCompletionStatus, aby pokryć się z gniazdem io na moim serwerze. W celu kontroli przepływu podczas wysyłania do klienta zezwalam tylko na kilka wywołań WSASend (), gdy wszystkie oczekujące OVERLAPy wyskoczyły z IOCP.

Problem: Ostatnio zdarzają się sytuacje, w których OVERLAP nie wracają do IOCP. Wątek wywołujący GetQueuedCompletionStatus ich nie dostanie i pozostanie w mojej lokalnej kolejce oczekującej. Sprawdziłem, że klient odbiera dane z gniazda i gniazdo jest podłączone. Podczas wykonywania wywołań WSASend () nie zostały zwrócone żadne błędy. OVERLAP po prostu „nigdy” nie wracają bez zewnętrznego bodźca, takiego jak:

Odłączenie gniazda od klienta lub serwera natychmiast pozwala wątkowi GetQueuedCompletionStatus na pobranie OVERLAPWykonywanie dodatkowych wywołań do WSASend (), czasami kilka jest potrzebnych, zanim nagle wszystkie OVERLAP wyskoczą z kolejki.

Pytanie: Czy ktoś widział tego typu zachowanie? Jakieś pomysły na to, co to powoduje?

Dzięki, Geoffrey

questionAnswers(1)

yourAnswerToTheQuestion