Windows Internet API(WinINet API라고도 불림)는 HTTP, FTP, gopher 프로토콜을 지원하는 하이 레벨의 네트워크 API들이다. 동기와 비동기 모드 둘 다를 지원하며, 서버를 만드는 데는 사용할 수 없다. 실제 코드가 들어있는 wininet.dll은 winsock32.dll과는 무관하다. HTTP 문서를 자동으로 캐싱해주는 기능이나, 레지스트리에 있는 프락시 서버 설정을 자동으로 이용하는 등 상당히 편리하다.
해당하는 컴퓨터가 인터넷에 연결되어있는지의 여부를 알려면 다음과 같이 하면 된다.
BOOL IsConnectInternet() { DWORD dwFlags; BOOL bChkInternet = InternetGetConnectedState(&dwFlags,0); if(!bChkInternet) return FALSE; return TRUE; }
InternetGetConnectedState
함수는 인터넷에 연결되어 있는 경우에만 TRUE를 리턴한다. 위의 예제에서는 이를 이용하고 있다. 하지만 제대로 하려면 dwFlags 값을 활용해야한다.
플래그값 | 의미 |
---|---|
INTERNET_CONNECTION_CONFIGURED | Local system has a valid connection to the Internet, but it might or might not be currently connected. |
INTERNET_CONNECTION_LAN | Local system uses a local area network to connect to the Internet. |
INTERNET_CONNECTION_MODEM | Local system uses a modem to connect to the Internet. |
INTERNET_CONNECTION_MODEM_BUSY | No longer used. |
INTERNET_CONNECTION_OFFLINE | Local system is in offline mode. |
INTERNET_CONNECTION_PROXY | Local system uses a proxy server to connect to the Internet. |
INTERNET_RAS_INSTALLED | Local system has RAS installed. |
임의의 서버에 파일을 업로드하는 샘플
LPCSTR pHost = "some.where.ftp.listen"; LPCSTR pUsername = "tester"; LPCSTR pPassword = "*******"; LPCSTR pProxy = "ProxyServerName"; HINTERNET hInternet = ::InternetOpen( "Microsoft Internet Explorer", INTERNET_OPEN_TYPE_PROXY, pProxy, NULL, INTERNET_FLAG_ASYNC); HINTERNET hFTPSession = ::InternetConnect( hInternet, pHost, INTERNET_INVALID_PORT_NUMBER, pUsername, pPassword, INTERNET_SERVICE_FTP, 0, (DWORD)0); BOOL bSuccess = ::FtpPutFile( hFTPSession, "LocalName.dat", "RemoteName.dat", FTP_TRANSFER_TYPE_BINARY, 0); ::InternetCloseHandle(hFTPSession); ::InternetCloseHandle(hInternet);
http://www.somewhere.com/some_dir/somefile.html 파일 다운로드받기.
HINTERNET hINet, hConnection, hData; CHAR buffer[2048] ; CString m_strContents ; DWORD dwRead, dwFlags, dwStatus ; hINet = InternetOpen( "InetURL/1.0", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); if (!hINet) { AfxMessageBox("InternetOpen Failed"); return; } try { hConnection = InternetConnect( hINet, "www.somewhere.com", 80, " "," ", INTERNET_SERVICE_HTTP, 0, 0); if (!hConnection) { InternetCloseHandle(hINet); return; } // Get data hData = HttpOpenRequest( hConnection, "GET", "/some_dir/somefile.html", NULL, NULL, NULL, INTERNET_FLAG_KEEP_CONNECTION, 0); if (!hData) { InternetCloseHandle(hConnection); InternetCloseHandle(hINet); return; } HttpSendRequest(hData, NULL, 0, NULL, 0); while (InternetReadFile(hData, buffer, 255, &dwRead)) { if (dwRead == 0) return; buffer[dwRead] = 0; m_strContents += buffer; } } catch(CInternetException* e) { e->ReportError(); e->Delete(); } InternetCloseHandle(hConnection); InternetCloseHandle(hINet); InternetCloseHandle(hData);
단순히 다운로드가 목적이라면, URLDownloadToFile 함수를 사용하는 것이 나을 듯 하다. 이에 관한 사항은 HttpGet 페이지를 참고.