본문 바로가기
개발이야기

[MFC/C++]인터넷연결확인하기 (InternetGetConnectedState 를 쓰거나 안쓰거나)

by 코저씨 2018. 8. 2.
728x90

아직도 일하다 보면 VC 6.0 으로 만들어진 프로그램이 많이 있긴 하다.

솔직히 지금도 VC 6.0 으로 만들어진 프로그램이 부족하거나 하지 않고 충분히 현역으로 돌아가도 문제는 없다.


하지만 네트워크 라던가 보안에 관련된 함수를 사용해야 하는 경우는 조금 문제가 심각해 진다.

OS가 변경이 없다면 구 컴파일로 충분하지만 OS가 모종의 잠수함 패치등으로 내부 기능이 변경되거나 하면


당시에는 정상작으로 돌아갔던 프로그램이 추후에는 문제가 되고 이게 고객의 컴플레인이 된다.


"전에는 잘 됐는데 갑자기 안된다." 


이번에 작업한 내용은 InternetGetConnectedState 함수가 POSReady2009에서 동작이 이상해 진 것.

전에는 잘된 함수였는데 어느OS  업데이트 이후 함수가 바로 리턴되던 구조였는데 내부 연결이 될때까지 

Hang이 걸리거나 실제 연결이 되지도 않았는데 빠져 나오는 일이 발생했다. 


그런데 생각해보니 나는 펌웨어나 임베디드만 해서 그런가 컴파일러 버전이외에는 크게 신경쓰는 게 없었는데


OS가 전에 지원하던 기능을 지원하지 않는다.

라는 사실은.. 생각보다 끔찍한 일이 아닐수가 없다. 


이번에 확인한 것을 나열하면


1. VC 6.0 에서 빌드한 raw level UDP통신( ex: ping)이 동작하지 않는다.
   -> 신기한건 같은 소스를  VS 2008 에서 빌드하면 된다. 

  -> 랜섬웨어 으로 인한 네트워크 문제로 인하여 OS차원에서  제한을 한것 같다.


InternetGetConnectedState 라는 인터넷 연결 확인 함수는 다음과 같이 해결했다.

 (https://docs.microsoft.com/en-us/windows/desktop/api/wininet/nf-wininet-internetgetconnectedstate)


1.  상위 컴파일러 (VS2008 이상)으로 빌드 하거나

2. 네트워크 라우트 설정이 정상적으로 세팅되면 등록되는 기본 게이트 웨이 주소 (0.0.0.0)이 생성되는 것으로 인터넷 연결 확인을 검사하도록 소스 변경

   (route print를 cmd에서 실행하면 확인가능, https://www.codeproject.com/Tips/67577/Check-for-an-active-Internet-connection)


이번 일로 얻은 정보 중 재미있는 것은, 윈도우 OS가 네트워크 아덥터가 외부 인터넷에 연결된것을 어떻게 확인하는지 이다.

외부 사이트에 접속하거나 핑하겠지 했는데, 다음 사이트에서 보기 좋게 정리해두었다.


https://blog.superuser.com/2011/05/16/windows-7-network-awareness/




728x90