Подключение к FTP

Тема в разделе "WASM.BEGINNERS", создана пользователем vg, 24 дек 2008.

  1. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Пытаюсь подключиться к ftp.narod.ru к реальному акаунту
    Код (Text):
    1.     HINTERNET hInternet = InternetOpen("lpszAgent", INTERNET_OPEN_TYPE_DIRECT, 0, 0, 0);
    2.     if (hInternet != 0)
    3.     {
    4.         HINTERNET hConnect = InternetConnect(hInternet, "ftp.narod.ru", INTERNET_DEFAULT_FTP_PORT, "имя", "пароль", INTERNET_SERVICE_FTP, INTERNET_FLAG_EXISTING_CONNECT | INTERNET_FLAG_PASSIVE, 0);
    5.         if (hConnect != 0)
    6.         {
    7.             MessageBox(0,"OK",0,MB_OK);
    8.             InternetCloseHandle(hConnect);
    9.         }
    10.         else
    11.         {
    12.             MessageBox(0,"Error",0,MB_OK);
    13.         }
    14.     }
    15.     BOOL lRes = InternetCloseHandle(hInternet);
    Выдаёт MessageBox(0,"Error",0,MB_OK) (в Vista). Почему? У вас работает?
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    vg
    1) что GetLastError?

    2) если попробовать так
    Код (Text):
    1. hConnect = InternetConnect(hInternet, "ftp://имя:пароль@narod.ru", INTERNET_DEFAULT_FTP_PORT, NULL, NULL, ...
     
  3. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Не могу получить код :)
    Код (Text):
    1. void GetError()
    2. {
    3.     // Retrieve the system error message for the last-error code
    4.  
    5.     LPTSTR pszMessage;
    6.  
    7.     DWORD dwLastError = GetLastError();
    8.  
    9.     FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwLastError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&pszMessage, 0, NULL );
    10.  
    11.     MessageBox(0,pszMessage,0,MB_OK);
    12.  
    13.     LocalFree(pszMessage);
    14. }
    MessageBox пустой. Что-то неправильно?
    То же самое.
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    vg
    попробуй
    Код (Text):
    1. #define STRICT
    2. #define WIN32_LEAN_AND_MEAN
    3. #include <windows.h>
    4. #include <wininet.h>
    5. #include <tchar.h>
    6.  
    7. #pragma comment(linker, "-entry:start -subsystem:windows")
    8. #pragma comment(lib, "kernel32.lib")
    9. #pragma comment(lib, "user32.lib")
    10. #pragma comment(lib, "wininet.lib")
    11.  
    12. static void WinInetLastError(DWORD lasterror, LPCTSTR pszFunc)
    13. {
    14.   TCHAR  msg[ 1024 ];
    15.  
    16.   DWORD  size   = 512;
    17.   LPTSTR buffer = GlobalAlloc(GPTR, size * sizeof(TCHAR));
    18.  
    19.   if (NULL == buffer)
    20.     wsprintf(msg, _T("InetLastError: GlobalAlloc failed %d"), GetLastError());
    21.   else
    22.   {
    23.     msg[ 0 ] = _T('\0');
    24.  
    25.     if (ERROR_INTERNET_EXTENDED_ERROR == lasterror)
    26.     {
    27.       DWORD ecode = 0;
    28.  
    29.       if (0 == InternetGetLastResponseInfo(&ecode, buffer, &size))
    30.         wsprintf(msg, _T("InetLastError: InternetGetLastResponseInfo failed %d"), GetLastError());
    31.       else
    32.         wsprintf(msg, _T("%s INTERNET_EXTENDED_ERROR: %d %s"), pszFunc, ecode, buffer);
    33.     }
    34.     else
    35.     {
    36.       DWORD lang = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT);
    37.       DWORD flag = FORMAT_MESSAGE_FROM_SYSTEM;
    38.  
    39.       if(0 == FormatMessage(flag, NULL, lasterror, lang, buffer, size, NULL))
    40.       {
    41.         HMODULE hDll = GetModuleHandle(_T("wininet.dll"));
    42.         if (NULL == hDll)
    43.           wsprintf(msg, _T("InetLastError: GetModuleHandle failed %d"), GetLastError());
    44.         else
    45.         {
    46.           DWORD flag = FORMAT_MESSAGE_FROM_HMODULE;
    47.  
    48.           if (0 == (FormatMessage(flag, hDll, lasterror, lang, buffer, size, NULL)))
    49.             wsprintf(msg, _T("InetLastError: FormatMessage failed %d"), GetLastError());
    50.           else
    51.             wsprintf(msg, _T("%s failed %d %s"), pszFunc, lasterror, buffer);
    52.         }
    53.       }
    54.       else
    55.         wsprintf(msg, _T("%s failed %d %s"), pszFunc, lasterror, buffer);
    56.     }
    57.  
    58.     MessageBox(NULL, msg, NULL, MB_OK);
    59.  
    60.     GlobalFree(buffer);
    61.   }
    62. }
    63.  
    64.  
    65. static void foo(void)
    66. {
    67.   LPCTSTR url  = _T("ftp.narod.ru");
    68.   LPCTSTR user = _T("имя");
    69.   LPCTSTR pwd  = _T("пароль");
    70.  
    71.   HINTERNET hInternet = InternetOpen(_T("foo"), INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0);
    72.   if (0 == hInternet)
    73.     WinInetLastError(GetLastError(), _T("InternetOpen"));
    74.   else
    75.   {
    76.     HINTERNET hConnect = InternetConnect(hInternet, url, INTERNET_DEFAULT_FTP_PORT,
    77.                            user, pwd, INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
    78.     if (0 == hConnect)
    79.       WinInetLastError(GetLastError(), _T("InternetConnect"));
    80.     else
    81.     {
    82.       MessageBox(NULL, _T("Everything is allright."), _T("hi"), MB_OK);
    83.       InternetCloseHandle(hConnect);
    84.     }
    85.     InternetCloseHandle(hInternet);
    86.   }
    87. }
    88.  
    89.  
    90. void __declspec(naked) start(void)
    91. {
    92.   foo();
    93.   ExitProcess(0);
    94. }
     
  5. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Код (Text):
    1. LPTSTR buffer = GlobalAlloc(GPTR, size * sizeof(TCHAR));
    Компилятор (MSVS 2008) ругается error C2440: 'initializing' : cannot convert from 'HGLOBAL' to 'LPTSTR'
    Если заменить LPTSTR на HGLOBAL
    Код (Text):
    1.  if (0 == InternetGetLastResponseInfo(&ecode, buffer, &size))
    error C2664: 'InternetGetLastResponseInfoA' : cannot convert parameter 2 from 'HGLOBAL' to 'LPSTR'
    Код (Text):
    1. if(0 == FormatMessage(flag, NULL, lasterror, lang, buffer, size, NULL))
    error C2664: 'FormatMessageA' : cannot convert parameter 5 from 'HGLOBAL' to 'LPSTR'
    Код (Text):
    1. if (0 == (FormatMessage(flag, hDll, lasterror, lang, buffer, size, NULL)))
    error C2664: 'FormatMessageA' : cannot convert parameter 5 from 'HGLOBAL' to 'LPSTR'
     
  6. GMax

    GMax Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    218
    vg
    Попробуй так:
    InternetOpen
    FtpFindFirstFile
    FtpOpenFile
    InternetReadFile
     
  7. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
  8. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    K10
    Низкоуровневое программирование под Win32.
     
  9. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    vg
    (MSVS 2008) ругается error ...
    Удали #define STRICT. И опять попробуй.
     
  10. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    У меня его и не было. Добавил.
    Теперь плюс к
    error C2440: 'initializing' : cannot convert from 'HGLOBAL' to 'LPTSTR'
    выдаёт
    warning C4005: 'STRICT' : macro redefinition c:\...\stdafx.h
    Т. е., как я понял, он был (где-то в подключаемых файлах).
     
  11. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    vg
    Хорошо. Если у тебя уже есть STRICT, то мой, можно удалить. Замени/добавь в #4
    Код (Text):
    1. ...
    2. //-- LPTSTR buffer = GlobalAlloc(GPTR, size * sizeof(TCHAR));
    3. LPTSTR buffer = (LPTSTR) GlobalAlloc(GPTR, size * sizeof(TCHAR));
    4. ...
    5. //-- GlobalFree(buffer);
    6. GlobalFree((HGLOBAL) buffer);
    7. ...
     
  12. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    q_q
     
  13. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    vg
    А, например, из explorerftp открывается?
     
  14. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    q_q
    Хм... нет. Я всегда с FTP работаю через Total Commander (работает нормально), поэтому не замечал. Что может быть? Комп к Интернету подключён через прокси (UserGate) в локалке.
     
  15. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    vg
    > с FTP работаю через Total Commander (работает нормально)
    Возможно, total общается с ftp примерно так, как писал K10 в #7.
    Посмотри (например, при помощи netstat или tcpview by sysinternals) держит ли total открытое соединение, когда не передает/принимает файлы.

    > через прокси (UserGate) в локалке
    Попробуй выйти в проводнике на ftp.microsoft.com. Если получится, то попробуй, заменив в коде
    Код (Text):
    1.   LPCTSTR url  = _T("ftp.microsoft.com");
    2.   LPCTSTR user = NULL;
    3.   LPCTSTR pwd  = NULL;
    выйти туда через программу.
     
  16. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    А что он там писал (кажется он только писал, что топик недостаточно низкоуровневый) ? Теперь там только "-".
    Если подключение не установлено, то Totalcmd.exe в списке нет.
    Если подключение установлено (без передачи файлов) - Totalcmd.exe:2648 ... ESTABLISHED
    С проводником я уже разобрался (в настройках прокси не был указан адрес для FTP) - всё открывается, включая ftp.microsoft.com. Моя прога по старому - InternetConnect failed 12029 A connection with the server could not be established.
     
  17. djmans

    djmans New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2006
    Сообщения:
    312
    InternetOpen(NULL, INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0);
     
  18. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    djmans
    Так и есть.
     
  19. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    vg
    > что он там писал
    Прошу прощения. Я перепутал с другим сообщением.

    > проводником я уже разобрался (в настройках прокси не был указан адрес для FTP) - всё открывается
    Т.е. ты ходишь в инет через прокси.
    Сейчас у меня нет возможности попробовать такую конфигурацию, поэтому только предположение. Попробуй изменить в коде
    Код (Text):
    1. //-- HINTERNET hInternet = InternetOpen(_T("foo"), INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0);
    2. HINTERNET hInternet = InternetOpen(_T("foo"), INTERNET_OPEN_TYPE_PROXY,
    3.                         _T("ftp=ftp://<йпи или имя прокси>:<порт прокси>"),
    4.                         _T("пароль на прокси"), 0);
     
  20. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    InternetConnection failed 12002 The operation timed out