Smart Box

Winhttp vs Inet 본문

Computer/Windows 정보

Winhttp vs Inet

프매씨 2009. 8. 23. 11:25
Winhttp VS Inet

보통 웹으로부터 소스를 캐오는것을 만들었다거나, 웹 관련된것을 해본 경험이 있는분이라면,
적어도 inet은 알고있었을꺼예요. 거기 당신, 모른다고 꽥꽥대지 말아요!
우선 제가 지금까지 조사한 결과는 이래요.

- Information -

- Winhttp -

단일 스레드 환경으로 작동하는 웹 컨트롤이예요.
단일로 작동하기 때문에 시동 속도는 무지하게 빨라요.
또한 CPU 사용률도 적구요. 하지만, 단일스레드라는것 자체에 단점이 있어요.
웹에 명령을 내리고, 웹으로부터 답신을 완전히 받는 작업을 수행하기까지 그 수행작업을 실행시킨 프로그램은
그 프로그램이 멀티 스레딩 환경으로 작용하지 않은 한 동작이 멈춰버려요.
결론은 이래요,

시동속도 : ★★★★★★★★☆☆
연속속도 : ★★★★★★★☆☆☆
멀티스레딩 : 불가능
CPU사용률 : 하

- Inet -

무려! 멀티 스레드 환경으로 작동하는 웹 컨트롤이예요.
멀티로 작동하기 때문에 시동 속도는 어느정도 느려요.
CPU 사용률도 Winhttp보다는 무겁지요. 하지만, Winhttp와는 다르게 멀티스레딩으로 작동한다는 사실!
웹에 명령을 내리고, 웹으로부터 답신을 완전히 받는 작업을 수행하기까지 그 수행작업을 실행시킨 프로그램은
그 프로그램이 단일스레드 환경으로 작용했더라도 동작이 멈추지 않아요!
게다가, 빠른 속도로 연속으로 작동한다면 Winhttp와 거의 비슷해요! 약간 빠를지도 모르겠어요.
결론은 이래요,

시동속도 : ★★★★★☆☆☆☆☆
연속속도 : ★★★★★★★☆☆☆
멀티스레딩 : 가능
CPU사용률 : 중

- Source Code -

이건 지금까지 제가 수집해서 제작했던 자료들이예요.

Winhttp을 이용해서 웹 소스 얻기

우선적으로 [프로젝트(P)] -> [참초(N)...]에서
[Microsoft WinHTTP Services, version 5.1]를 체크해주세요

Public Function GetUrlCodeWinHTTP(sURL As String, ConTime As Long, ReTime As Integer) As String

'GetUrlSource ["소스 추출할 웹 주소"], ["연결을 기다리는 최대 시간"], ["실패시 재시도 횟수"]
Dim i As Integer
Dim strs As String


On Error Resume Next 'Winhttp는 인터넷이 갑자기 끊기거나 안좋아질때 에러날 확률이 높아요.


With WinHttpCr
.SetTimeouts ConTime, ConTime, ConTime, ConTime 'Winhttp에게 연결을 기다리는 시간을 설정해주어요.
    For i = 0 To ReTime
    .Open "GET", sURL
    .Send
    strs = StrConv(.ResponseBody, vbUnicode)
        If Not strs = Empty Then GetUrlSource = strs: Exit Function '연결 성공하면 소스 받고 종료.
    DoEvents
    Next
End With

End Function





















 






도움 출처 : http://coolsoft2.com/

Inet을 이용해서 웹 소스 얻기(수학쟁이님 버전)

우선적으로 [프로젝트(P)] -> [구성 요소(O)...]에서
[Microsoft Internet Transfer Control 6.0]를 체크해주세요

Public Function GetUrlCodeInet_v1(ByVal URL As String, ByRef inet As inet) As String

'수학쟁이님이 만드신 소스예요.
On Local Error GoTo Err:
Dim Total As String, Chunks As String
inet.Cancel 'Inet이 켜있을때를 대비해 미리 Inet을 취소시켜요
inet.URL = URL 'Inet에 주소를 장전해요.
inet.Execute inputhdrs:="User-agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)" & vbCrLf


    Do While inet.StillExecuting 'Inet이 준비 완료될때까지 기다려요.
    DoEvents '여기서, 이 방법은 듀얼코어 환경에서 오버플로우 에러가 발생할수 있어요.
    Loop


    Do '준비가 완료되면 Inet으로부터 소스를 차근차근 줍어 담아요.
    Chunks = inet.GetChunk(1024, icString)
    Total = Total & Chunks 'OpenURL을 이용하면 일부밖에 얻지 못하므로
    Loop While Len(Chunks) '수학쟁이님은 이 방법을 쓰신듯 해요.


GetUrlCodeInet_v1 = Total '소스 반영
Err:
inet.Cancel


End Function




 























그리고, 이번의 핵심이라 할수있는!
Inet을 이용해서 웹 소스 얻기 직접 작성한 코드예요!

 

 


Public Function GetUrlCodeInet_v2(sURL As String, ConTime As Long, ReTime As Integer, ByRef inet As inet) As String

'이 소스는 모든 소스들을 연구하고 정리하여 직접 짠 소스예요.
On Error Resume Next


Dim i As Integer
Dim Total As String, Chunks As String
With inet
.Cancel '혹시 작업중일지 모르니 작업 취소
.RequestTimeout = ConTime '연결하는데 걸리는 시간을 재한
    For i = 0 To ReTime '연결 실패시 재시도 횟수예요.
    Total = .OpenURL(sURL)
    If Not Total = Empty Then Exit For '연결되면 For 종료
    Next
        If Total = Empty Then Exit Function '연결이 안되서 못받았다면 그대로 종료
    Do '정상적으로 연결되서 일부 소스를 받았다면 나머지도 전부 받기
    Chunks = .GetChunk(1024, icString)
    Total = Total & Chunks
    Loop While Len(Chunks)
GetUrlCodeInet_v2 = Total '소스 반영
End With

End Function


 

























이 3가지의 소스에 대해 부수적으로 설명해드릴께요.

첫번째의 WinHTTP를 이용해 웹소스를 가져오는 소스는
속도면에서는 좋지만, 용도에 따라서는 별로 좋지 않은 방법일수 있어요.
소스를 받아올때까지는 아무 작업도 하지 못하게 되니까요.
예를들어 네이버 게시글을 서버로 팀원들의 공지사항 프로그램을 만들었는데,
가동중에 갑자기 인터넷 상태가 안좋아진다거나 한다면,
연결 제한시간동안 아무작업도 못하게되요!

두번째의 Inet을 이용해 웹소스를 가져오는 소스는
완벽했어요! 듀얼코어 환경에서 테스트해보기 전까지는.
Do Loop을 이용해 웹에서 소스를 받아올때까지 기다리기때문에,
컨넥팅 시간이 길어지면 길어질수록 CPU 100%차지와
심지어 듀얼코어 환경에서는 오버플로우를 유발할수 있어요!
(연속사용시 듀얼코어에서는 70% 이상 즉시 오버플로우 발생)

마지막으로 세번째!, 제가 직접 연구해서 작성한 소스예요.
수학쟁이님 소스의 단점을 해결했죠.
이제 듀얼코어에서의 오버플로우도 없고, 심지어 수학쟁이님 소스보다 처리속도가 빨라요!
다만, 제 노트북에서만 그런지 600~700회정도 연속으로 돌리면 오류보고창이 뜨면서
꺼지더군요.
만일, 다른분들도 저처럼 꺼진다면 제게 말해주세요!
해결법도 안다면 제가 무지 기뻐할꺼예요!

출처 : 고구마S

Comments