사용자 도구

사이트 도구


kb:windowsinternetapi

Windows Internet API

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.

FTP

임의의 서버에 파일을 업로드하는 샘플

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

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 페이지를 참고.

링크

kb/windowsinternetapi.txt · 마지막으로 수정됨: 2014/11/09 21:14 (바깥 편집)