InternetConnect

Тема в разделе "WASM.NETWORKS", создана пользователем cresta, 15 июл 2006.

  1. cresta

    cresta Active Member

    Публикаций:
    0
    Добрый день.
    Нужно загнать по ftp файл на сервер. Тонкостей работы в сети не знаю, кто силён в этом, подсобите.
    Значит установлен сервер на локальной машине. На нём сайт www.site.ru
    Хочу в корень сайта (рядом с index.html) положить файл C:\file.txt.
    Вроде это делает ф-ция FtpPutFile, но ей нужен хэндл от InternetConnect, которой в свою очередь нужен хэндл от InternetOpen.


    Код (Text):
    1. .data
    2.     szAgent     db  "myAgent",0
    3.     szHost      db  "ftp.site.ru"
    4.  
    5. .code
    6.     invoke  InternetOpen, addr szAgent, INTERNET_OPEN_TYPE_DIRECT, 0, 0, INTERNET_FLAG_ASYNC
    7.     .if     (eax)
    8.         mov     hInet,eax
    9.         invoke  InternetConnect, hInet, addr szHost, INTERNET_DEFAULT_FTP_PORT, NULL, NULL, INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, addr read
    10.         .if     (eax)
    11.             PrintText "connect"
    12.         .else
    13.             mov     dwErrorSize, 256
    14.             invoke InternetGetLastResponseInfo, addr dwError, addr szError, addr dwErrorSize
    15.             PrintString szError
    16.         .endif
    17.                            
    18.         invoke  InternetCloseHandle,hInet
    19.     .endif
    20.  
    21. InternetConnect возвращает ноль. Вызываю InternetGetLastResponseInfo - никакой ошибки не выдает.
     
  2. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    а вы вызовите GetLastError и увидите ошибку .

    Попробуй так
    Код (Text):
    1.     invoke  InternetOpen, addr szAgent, INTERNET_OPEN_TYPE_DIRECT, 0, 0, 0
    2.     .if     (eax)
    3.         mov     hInet,eax
    4.         invoke  InternetConnect, hInet, addr szHost, INTERNET_DEFAULT_FTP_PORT, NULL, NULL, INTERNET_SERVICE_FTP, 0,0
    5.         .if     (eax)
    6.             invoke MessageBox,0, addr msg_conn,0,MB_OK
    7.         .else
    8.             invoke GetLastError
    9.             invoke MessageBox,0, addr msg_err,0,MB_OK
    10.         .endif
    11.                            
    12.         invoke  InternetCloseHandle,hInet
    13.     .endif
     
  3. YoungBastard

    YoungBastard New Member

    Публикаций:
    0
    cresta

    http://rsdn.ru/article/inet/wininet.xml
    http://rsdn.ru/article/inet/inetapi.xml
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wininet/wininet/internetopen.asp
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wininet/wininet/ftp_sessions.asp
    мне в свое время очень помогло и конечно же msdn! там есть все.

    вот еще метод из моего класса, может тожы поможет (рабочий 100%)
    Код (Text):
    1. BOOL InetDownloader::DownloadFile(LPSTR lpUrl, LPSTR lpLocalPath)
    2. {
    3.     HINTERNET hInternet,hUrl;
    4.     HANDLE    hOutputFile;
    5.     BOOL      bDownload;
    6.     CHAR      szBuff[80];
    7.     CHAR      cBuffer[16384];
    8.     DWORD     dwBytesRead;
    9.     ZeroMemory(szBuff,80);
    10.     DWORD     dw;
    11.     DWORD dwFormatFlags = FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM ;
    12.     LPSTR     messbuff;
    13.  
    14.     unsigned char * aFile = NULL;
    15.     DWORD           num   = 50000;
    16.     DWORD     dwSize = NULL;
    17.     DWORD     dwWrittenBytes = NULL;
    18.  
    19.     hInternet = InternetOpen("X",INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY,NULL,NULL,NULL);
    20.     hInternet ? printf("InternetOpen() OK\n") : printf("InternetOpen() error\n");
    21.     hUrl      = InternetOpenUrl(hInternet,lpUrl,NULL,NULL,NULL,NULL);
    22.     if(hUrl) {
    23.         hOutputFile = CreateFile(lpLocalPath,GENERIC_WRITE, NULL, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    24.         if(hOutputFile == INVALID_HANDLE_VALUE)
    25.             printf("CreateFile() error\n");
    26.         printf("InternetOpenUrl() OK\n");  
    27.         do {
    28.             bDownload = InternetReadFile(hUrl, cBuffer,(DWORD)16384,&dwBytesRead);
    29.             bDownload ? printf("%d\n",dwBytesRead) : printf("InternetReadFile() error\n");
    30.             dwSize+=dwBytesRead;
    31.             if(dwBytesRead)
    32.                 if(!WriteFile(hOutputFile,&cBuffer,(DWORD)dwBytesRead,&dwWrittenBytes,NULL))
    33.                     printf("WriteFile() error!\n");
    34.         } while(dwBytesRead);
    35.         InternetCloseHandle(hUrl);
    36.         InternetCloseHandle(hInternet);
    37.     } else printf("InternetOpenUrl() error\n");
    38.     dw        = GetLastError();
    39.     FormatMessage(dwFormatFlags,NULL,dw,MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPSTR)&messbuff,0,NULL);
    40.     CharToOem(messbuff,messbuff);
    41.     printf("Error: %s\n", messbuff);
    42.  
    43.     return TRUE;
    44. }
    правда коряво написан... ну, сойдет для наглядности
     
  4. cresta

    cresta Active Member

    Публикаций:
    0
    TermoSINteZ
    InternetConnect не устанавливает lasterror. Для wininet есть специально InternetGetLastResponseInfo, которая возвращает строку с описанием ошибки. У меня возвращается пустая строка. А вызов GetLastError после InternetGetLastResponseInfo выдаёт код 317:
    The system cannot find message text for message number 0x%1 in the message file for %2.
    Как я понял, система не нашла строки с описанием для ошибки, вызваной функцией InternetConnect.

    YoungBastard
    Это не совсем то, мне нужно не скачать, а наоборот закачать на сервер файл. InternetReadFile не поможет.

    Самое интересное: тот код, который я привел, переделал на vb6 - и он работает :)
    Написать на vb что-ли...
     
  5. YoungBastard

    YoungBastard New Member

    Публикаций:
    0
    cresta

    я привел функцию где использовал InternetOpen. Собсна, попробуй на асме заюзать таким образом InternetOpen, думаю все получиЦа, т.е. через INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY.

    Самое интересное: тот код, который я привел, переделал на vb6 - и он работает :)
    Написать на vb что-ли...

    значит у тебя где-то на асме ошибка, вот и все... =)
    имхо, все должно работать
     
  6. Mescalito

    Mescalito New Member

    Публикаций:
    0
    cresta
    Чтоб узнать описание последней ошибки по коду надо вызвать FormatMessage с флагом ..._FROM_MODULE и хэндлом модуля wininet.dll
     
  7. slow

    slow New Member

    Публикаций:
    0
    из статьи рема про трояны
    Код (Text):
    1. hInternet := InternetOpen(nil, INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
    2.  
    3. hConnect := InternetConnect(hInternet, 'ftp.narod.ru', 21, 'Ms-Rem', '*****', INTERNET_SERVICE_FTP, 0, 0);
    4.  
    5. if hConnect <> nil then
    6.  
    7. begin
    8.  
    9. FtpPutFile(hConnect, 'c:\readme.txt', 'NewText.txt', FTP_TRANSFER_TYPE_BINARY, 0);
    10.  
    11. InternetCloseHandle(hConnect);
    12.  
    13. end;
    14.  
    15. InternetCloseHandle(hInternet);