2014-10-12 7 views
0

GetOverlappedResults()이 전혀 반환되지 않습니다.
간단한 예제를 실행했고 네트워크 인터페이스에 IP 주소가 변경되면 수동 재설정 이벤트가 설정되고 "IP 주소 테이블이 변경되었습니다."라는 출력이 표시 될 수 있지만 GetOverlappedResults()는 반환하지 않습니다. bWait 거짓입니다. bWait = true 인 경우에도 이벤트가 설정되어 I/O 작업이 완료되었으므로 리턴해야합니다.bWait = false 인 GetOverlappedResults 블록

무슨 일입니까?

#include <winsock2.h> 
#include <iphlpapi.h> 
#include <stdio.h> 
#include <windows.h> 

#pragma comment(lib, "iphlpapi.lib") 
#pragma comment(lib, "ws2_32.lib") 

void main() 
{ 
    OVERLAPPED overlap; 
    DWORD ret, nr; 
    HANDLE hand = NULL; 
    overlap.hEvent = CreateEvent(NULL, true, false, NULL); 

    ret = NotifyAddrChange(&hand, &overlap); 

    for (;;) 
    { 
     if (WaitForSingleObject(overlap.hEvent, INFINITE) == WAIT_OBJECT_0) 
     { 
      printf("IP Address table changed..\n"); 
      ret = GetOverlappedResult(hand, &overlap, &nr, false); 
      scanf_s("%d %d\n", ret, nr); 
      printf("done\n"); 
      NotifyAddrChange(&hand, &overlap); 
      ResetEvent(overlap.hEvent); 
     } 
    } 
} 
+1

ret == ERROR_IO_PENDING인지 확인해야합니다. 그 scanf_s() 호출은 끔찍한 잘못입니다. 맬웨어 방지 도구 등을 사용하지 마십시오. –

+1

공식 샘플과 동일한 문제가 있습니까? http://msdn.microsoft.com/en-us/library/windows/desktop/aa366329(v=vs.85).aspx 한스 (Hans)가 말하는 것과 같습니다. – usr

+0

'NotifyAddrChange()'와 같은 함수에 전달하기 전에'OVERLAPPED' 인스턴스의 메모리를 소거해야합니다. 초기화되지 않은 가비지 메모리를 전달 중입니다. –

답변

1

대기가 scanf_s()에 의해 발생합니다. 나는 당신이 printf 반환 값을 읽을 줄 알았는데.