WinSock - Je opravdu nepoužitelný ?

Aplikace pro demonstraci
Nejprve doporučuji si stáhnout přiložený demonstrační projekt, ten si budeme rozebírat. Projekt je »zde«.

Začátek
Abychom si ověřili, co vlastně posíláme ven a co se nám vrací, je formulář poněkud větší a obsahuje tři RichTextBoxy, z nichž do jednoho se bude zapisovat vygenerovaný HTTP požadavek, do druhého vrácená hlavička odpovědi a ve třetím se zobrazí vlastní tělo zprávy (neboli stažený soubor):

Všechna ostatní pole na formuláři jsou pro nastavení parametrů, z kterých se bude generovat požadavek na připojení a následně HTTP požadavek pro získání souboru.

Prvně si nadeklarujeme pár proměnných, co budeme používat (naleznete je v deklaracích na formuláři):

   
'Kam se připojujeme
   Private m_strRemoteHost As String
   'Cílový host pokud jdeme přes proxy
   Private m_strProxyHost As String
   'relativní cesta k souboru, který chceme získat
   Private m_strFilePath As String
   'odpověď serveru
   Private m_strHttpResponse As String
   'Proměnná pro příznak odpovědi
   Private m_bResponseReceived As Boolean
   'proměnná pro příznak záhlaví
   Private m_bHeaderReceived As Boolean
   'Hodnota "Content-Length" HTTP hlavičky
   Private m_lContentLength As Long
   'Proměnná pro hodnotu, kolik už se stáhlo
   Private m_lDownloadedBytes As Long

Tohle je jenom na okraj, abyste pak nebyli překvapení odkud se ty proměnné berou. Na události Form_Load je jen pár řádků pro vytvoření formuláře.

Protože se budeme připojovat k internetu i pomocí Proxy Serveru a můžeme tahat i chráněné zdroje, je nutné si napsat funkci, která bude provádět enkódování BASE64 (proč zrovna tohle jsem psal dříve). Tady ta funkce je:

Private Function Base64_Encode(strSource) As String

   Const BASE64_TABLE As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

   Dim strTempLine As String
   Dim j As Integer

   For j = 1 To (Len(strSource) - Len(strSource) Mod 3) Step 3
      strTempLine = strTempLine + Mid(BASE64_TABLE, (Asc(Mid(strSource, j, 1)) \ 4) + 1, 1)
      strTempLine = strTempLine + Mid(BASE64_TABLE, ((Asc(Mid(strSource, j, 1)) Mod 4) * 16 _
            + Asc(Mid(strSource, j + 1, 1)) \ 16) + 1, 1)
      strTempLine = strTempLine + Mid(BASE64_TABLE, ((Asc(Mid(strSource, j + 1, 1)) Mod 16) * 4 _
            + Asc(Mid(strSource, j + 2, 1)) \ 64) + 1, 1)
      strTempLine = strTempLine + Mid(BASE64_TABLE, (Asc(Mid(strSource, j + 2, 1)) Mod 64) + 1, 1)
   Next j

   If Not (Len(strSource) Mod 3) = 0 Then
      If (Len(strSource) Mod 3) = 2 Then
         strTempLine = strTempLine + Mid(BASE64_TABLE, (Asc(Mid(strSource, j, 1)) \ 4) + 1, 1)
         strTempLine = strTempLine + Mid(BASE64_TABLE, (Asc(Mid(strSource, j, 1)) Mod 4) * 16 _
            + Asc(Mid(strSource, j + 1, 1)) \ 16 + 1, 1)
         strTempLine = strTempLine + Mid(BASE64_TABLE, (Asc(Mid(strSource, j + 1, 1)) Mod 16) * 4 + 1, 1)
         strTempLine = strTempLine & "="
      ElseIf (Len(strSource) Mod 3) = 1 Then
         strTempLine = strTempLine + Mid(BASE64_TABLE, Asc(Mid(strSource, j, 1)) \ 4 + 1, 1)
         strTempLine = strTempLine + Mid(BASE64_TABLE, (Asc(Mid(strSource, j, 1)) Mod 4) * 16 + 1, 1)
         strTempLine = strTempLine & "=="
      End If
   End If

   
Base64_Encode = strTempLine

End Function

Zpět Další

Autor: The Bozena

iReklama.cz - nový reklamní systém
iReklama.cz - nový reklamní systém