InternetConnect

Discussion in 'WASM.NETWORKS' started by cresta, Jul 15, 2006.

  1. cresta

    cresta Active Member

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


    Code (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 Синоби даоса Staff Member

    Blog Posts:
    2
    Joined:
    Jun 11, 2004
    Messages:
    3,568
    Location:
    Russia
    а вы вызовите GetLastError и увидите ошибку .

    Попробуй так
    Code (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

    Blog Posts:
    0
    Joined:
    Mar 29, 2005
    Messages:
    231
    Location:
    Russia
    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%)
    Code (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

    Blog Posts:
    0
    Joined:
    Jun 13, 2004
    Messages:
    2,257
    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

    Blog Posts:
    0
    Joined:
    Mar 29, 2005
    Messages:
    231
    Location:
    Russia
    cresta

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

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

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

    Mescalito New Member

    Blog Posts:
    0
    Joined:
    Mar 31, 2005
    Messages:
    78
    Location:
    Харьков
    cresta
    Чтоб узнать описание последней ошибки по коду надо вызвать FormatMessage с флагом ..._FROM_MODULE и хэндлом модуля wininet.dll
     
  7. slow

    slow New Member

    Blog Posts:
    0
    Joined:
    Dec 27, 2004
    Messages:
    615
    из статьи рема про трояны
    Code (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);