tyomitch
Ситуация такая: пишу компоненту для 1С на VB. Компонента работает с FTP, используя синтаксис 1С.
Для начала хотелось бы ее научить работать двумя способами через прокси с авторизацией:
1) по протоколу SOCKS5
2) через HTTP-прокси с поддержкой FTP.
Почему именно такими способами? Да потому что есть тестовый FTP сервер (спасибо хорошим людям), который поддерживает именно эти варианты подключений и есть Total Commander на котором все это уже работает и можно проверить работоспособность сервера если что.
Так вот, сырой осадок: чего-то не фига не работает. Прога либо вообще не коннектится, либо коннектится напрямую (проверяю по логам). На всякий случай привожу примерный код программы:
- Код: Выделить всё
Option Explicit
Private Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (ByVal sAgent As String, ByVal lAccessType As Long, ByVal sProxyName As String, ByVal sProxyBypass As String, ByVal lFlags As Long) As Long
Private Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" (ByVal hInternetSession As Long, ByVal sServerName As String, ByVal nServerPort As Integer, ByVal sUsername As String, ByVal sPassword As String, ByVal lService As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long
Private Declare Function InternetSetOption Lib "wininet.dll" Alias "InternetSetOptionA" (ByVal hInternet As Long, nOption As Long, lpBuffer As String, nBufferLength As Long) As Integer
Private Declare Function HttpOpenRequest Lib "wininet.dll" Alias "HttpOpenRequestA" (ByVal hHttpSession As Long, ByVal sVerb As String, ByVal sObjectName As String, ByVal sVersion As String, ByVal sReferer As String, ByVal something As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long
Private Declare Function HttpSendRequest Lib "wininet.dll" Alias "HttpSendRequestA" (ByVal hHttpRequest As Long, ByVal sHeaders As String, ByVal lHeadersLength As Long, ByVal sOptional As String, ByVal lOptionalLength As Long) As Integer
Private Declare Function HttpQueryInfo Lib "wininet.dll" Alias "HttpQueryInfoA" (ByVal hHttpRequest As Long, ByVal lInfoLevel As Long, ByRef sBuffer As Any, ByRef lBufferLength As Long, ByRef lIndex As Long) As Integer
Private Const INTERNET_FLAG_KEEP_CONNECTION = &H400000
Private Const HTTP_QUERY_FLAG_NUMBER = &H20000000
Private Const HTTP_QUERY_STATUS_CODE = 19
Private Const INTERNET_OPTION_PROXY_USERNAME = 43
Private Const INTERNET_OPTION_PROXY_PASSWORD = 44
Private Const INTERNET_INVALID_PORT_NUMBER = 0
Private Const INTERNET_SERVICE_FTP = 1
Private Const INTERNET_SERVICE_HTTP = 3
Private hOpen As Long
Private hConnection As Long
Private hRes As Long
Private dwSeman As Long
Private sServer$, sUser$, sPassword$, dwStatus$
Private Sub Form_Load()
sServer = "ftp.tralala.ru"
sUser = "user"
sPassword = "password"
'инициализируемся
hOpen = InternetOpen("FTP Client", 3, "socks=" & sServer & ":1080", vbNullString, 0)
'Открываем сессию http
hConnection = InternetConnect(hOpen, sServer, INTERNET_INVALID_PORT_NUMBER, sUser, sPassword, INTERNET_SERVICE_HTTP, dwSeman, 0)
'Создаем хэндл запроса
hRes = HttpOpenRequest(hConnection, "GET", "/sysftp/index.txt", vbNullString, vbNullString, 0, INTERNET_FLAG_KEEP_CONNECTION, 0)
'отправляем юзера прокси
InternetSetOption hRes, INTERNET_OPTION_PROXY_USERNAME, sUser, Len(sUser) + 1
'отправляем пароль прокси
InternetSetOption hRes, INTERNET_OPTION_PROXY_PASSWORD, sPassword, Len(sPassword) + 1
'отправляем запрос
HttpSendRequest hRes, vbNullString, 0, vbNullString, 0
'вытаскиваем из него инфу
HttpQueryInfo hRes, HTTP_QUERY_FLAG_NUMBER Or HTTP_QUERY_STATUS_CODE, dwStatus, 4, 0
End Sub
А что собственно дальше???
Должно быть что-то типа такого:
- Код: Выделить всё
hConnection = InternetConnect(hOpen, sServer, INTERNET_INVALID_PORT_NUMBER, sUser, sPassword, INTERNET_SERVICE_FTP Or INTERNET_FLAG_KEEP_CONNECTION, dwSeman, 0)
но у меня hConnection обнуляется с ошибкой 87:Internet connection error.
Дальше чего делать ваще не знаю. Есть мысли?