На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
Модераторы: Qraizer
  
> download c HTPP сервака с помощью MFC ...
    плз, надо загрузить что-то вроде http://www.mail.ru/~vasily_pupkin/docs.zip ... реализация (примерно) ? или где найти инфу ??? спасибо ...
      у меня была подобная проблемма, тока надо было, чтобы программка скачивала с сервера РосБизнесКонсалтинг курс бакса. А этот курс хранится у них в текстовом файле.
      Решил я енту проблему с помощью bsd-styled сокетов, но компилировал в Visual C++. Просто мне нужно было, чтобы экзешник получился маленьким :)

      char *RbcMessage[] =
      {
      "GET http://www.rbc.ru/out/801.csv HTTP/1.0\r\n",
      "Accept: */*\r\n",
      "Referer: http://www.rbc.ru\r\n",
      "Accept-Language: ru\r\n",
      "Accept-Encoding: gzip, deflate\r\n",
      "User-Agent: Informer from RBC\r\n",
      "Host: www.rbc.ru\r\n\r\n\r\n",
      NULL
      };
      SOCKADDR_IN remoteAddr;
      PHOSTENT phe;
      SOCKET SendSocket;
      CString m_Kurs;
      CString m_Line;
      int err;
      int iMsg = 0;
      int iLength;
      int iEnd = 0;
      int ndx;
      int bytesReceived = 0;
      char szLine[712]; //предполагаемая длина принимаемого файла
      iLength = 0;
      WSADATA WSAData;
      WSAStartup(MAKEWORD(1, 1), &WSAData);
      //создаём сокет
      struct sockaddr_in srv_address;
      int namelen;
      SendSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
      if(SendSocket != INVALID_SOCKET) {
      memset(&srv_address,0,sizeof(SOCKADDR_IN));
      srv_address.sin_addr.S_un.S_addr=INADDR_ANY;
      srv_address.sin_family = AF_INET;
      srv_address.sin_port = 0;
      }
      if(bind(SendSocket, (SOCKADDR *) &srv_address, sizeof(SOCKADDR_IN)) == SOCKET_ERROR) {
      closesocket(SendSocket);
      return FALSE;
      } else {
      namelen=sizeof(SOCKADDR_IN);
      getsockname(SendSocket,(SOCKADDR *)&srv_address,&namelen);
      return TRUE;
      }
      //соединяем сокет с сервером
      if((phe = gethostbyname("www.rbc.ru"))!=0){ remoteAddr.sin_family = AF_INET;
      remoteAddr.sin_port = htons(RBC_PORT);
      memcpy((char *)&(remoteAddr.sin_addr), phe->h_addr, phe->h_length);
      err = connect (SendSocket, (PSOCKADDR) & remoteAddr, sizeof (remoteAddr));
      if(err) {
      m_Kurs = "Невозможно соединиться с сервером";
      return FALSE;
      }
      else {
      do {
      send(SendSocket, (LPSTR)RbcMessage[iMsg], strlen(RbcMessage[iMsg]), 0);
      iMsg++;
      } while(RbcMessage[iMsg]);
      }
      do {
      iLength = recv(SendSocket, szLine, 712, 0);
      if(iLength) {
      // Здесь проводится разборка принимаемого файла
      m_Line = szLine;
      if((ndx = m_Line.Find("USD ЦБ РФ"))!=-1) {
      m_Line = m_Line.Left(ndx+23);
      m_Line = m_Line.Mid(ndx+10);
      m_Kurs = "Курс ЦБ РФ: ";
      m_Kurs += m_Line;
      }
      else m_Kurs = "Неудаётся получить файл с сервера";
      }
      if(iLength==0) break;
      bytesReceived += iLength;
      } while ( bytesReceived < 712 );
      }
      else {
      m_Kurs = "Неудаётся установить связь с сервером";
      return FALSE;
      }

      естевственно надо не забыть добавить в проект файл WSOCK32.LIB
        Закачку файла не так сложно организовать используя MFC класы, или библиотеки WinInet.
        в первом случае посмотри
        CInternetSession, CHttpConnection, CHttpFile
        пример для наглядности:
        try
        {
        CString lpstrProxy=strProxyName+":"+strProxyPort;
        CInternetSession mysession(NULL,0,AccessType,lpstrProxy,NULL);
        CHttpFile *remotefile = (CHttpFile *)mysession.OpenURL(strUrl,1,INTERNET_FLAG_TRANSFER_BINARY);
        if (remotefile==NULL)
        {
        AfxMessageBox("Can't find file on the server...", MB_OK|MB_ICONSTOP);
        }

        CFile myfile(SavePath, CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);
        int numbytes = 0;
        long HTTPBUFLEN = 1000L;
        TCHAR httpbuff[HTTPBUFLEN];

        while (numbytes = remotefile->Read(httpbuff, HTTPBUFLEN))
        {
        myfile.Write(httpbuff, numbytes);

        }
        myfile.Close ();
        remotefile->Close ();
        delete remotefile;
        }
        catch(CException* e)
        {
        e->Delete();
        }

        ... для второго метода ф-и дублируют классы,
        они находятся wininet.h wininet.lib,
        но используют больше возможностей настройки
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0169 ]   [ 16 queries used ]   [ Generated: 17.06.24, 10:13 GMT ]