Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Computer ControlsComputer Controls
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Winsock - pobieranie pliku z internetu

16 Jun 2007 14:09 2094 5
  • Level 11  
    Mam mały problemik, napisałem program, który się auto-updatuje, lecz w czasie tego procesu ściąga on około 20 różnych plików. Nawiązuję połączenie z moją stroną internetową, wysyła na serwer prośbę o otrzymanie pliku, otrzymuje go, lecz w tym momencie, zamiast szybko przejść do następnego pliku, program czeka jakieś 10-15 sekund (niezależnie od wielkości pobranego pliku). Gdy jest pobieranych 20 plików cały ten czas się kumuluje i tylko marnuje mój cenny czas podczas testowania. Czym to jest spowodowane ??
  • Computer ControlsComputer Controls
  • Level 17  
    Ciężko stwierdzić. Nie wiadomo czy to wina kodu czy może serwer w taki sposób reaguje. Może wrzucisz kod?

    pozdrawiam
  • Computer ControlsComputer Controls
  • Level 11  
    void odbierz(const char* nazwa,int sock)
    {
    using namespace WS;
    fstream plik;
    char bufor[4096];
    plik.open(nazwa,ios::binary|ios::out);
    int roz=0;
    while(true)
    {
    int n = recv(sock,bufor,4095,0);
    roz+=n;
    status("Pobieranie pliku...\nOdebrano: "+do_str(roz)+" B",false);
    blit(ekran,screen,0,0,0,0,res_x,res_y); //dublebuffering - rzut na ekran
    if((n==-1)||(n==0)) break;
    plik.write(bufor,n);
    }
    plik.flush();
    plik.close();
    }

    bool wywalNaglowki(const char* nazwa)
    {
    fstream plik;
    plik.open(nazwa,ios::binary|ios::in);
    if(!plik) return false;
    plik.seekg(0,ios::end);
    int dl=plik.tellg();//rozmiar pliku
    plik.seekg(0,ios::beg);
    char* buf=new char[dl];
    plik.read(buf,dl);
    plik.close();

    bool zn=false;int poz=0;
    for( poz=0;poz<dl-4;poz++)
    if((buf[poz]==13)&&(buf[poz+1]==10)&&(buf[poz+2]==13)&&(buf[poz+3]==10)){
    zn=true;break;
    }
    if(zn==false) {
    delete [] buf;
    return false;
    }

    plik.open(nazwa,ios::binary|ios::out);
    plik.write(&buf[poz+4],dl-poz-4);
    plik.close();
    delete [] buf;

    return true;
    }

    int pobierz_plik_z_neta(string plik, string do_)
    {
    using namespace WS;
    string zapytanie = "GET /data/"+plik+" HTTP/1.1\r\nHost: vault-of-the-pit.ovh.org\r\n\r\n";

    send(sock,zapytanie.c_str(),zapytanie.length(),0);
    odbierz(do_.c_str(),sock);


    if(!wywalNaglowki(do_.c_str()))
    MSG_BOX("Pobieranie pliku","Nastapil niezidentyfikowany blad",1,110);

    clear_keybuf();
    licznik = general_counter;
    return 0;
    }

    void polacz_z_serwerem(){

    status("Laczenie z internetem\nCzekaj...",false);
    blit(ekran,screen,0,0,0,0,res_x,res_y); //dublebuffering - rzut na ekran

    using namespace WS;
    WSADATA wsaData;
    int blad = WSAStartup(wersja, &wsaData );


    struct sockaddr_in sin;
    host=gethostbyname("vault-of-the-pit.ovh.org");
    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = ((struct in_addr *)(host->h_addr))->s_addr;//adres uzyskany wczesiej
    sin.sin_port = htons(80); //port

    sock = socket(PF_INET, SOCK_STREAM, 0);
    if(socket<0) {
    MSG_BOX("Polaczenie","Nie udalo sie stworzyc socketa",2,112);
    }

    if(connect(sock,(struct sockaddr *)&sin,sizeof(sin))<0){
    MSG_BOX("Polaczenie","Nie udalo sie polaczyc z hostem",2,111);
    }
    }

    void zerwij_polaczenie_z_serwerm(){
    using namespace WS;
    closesocket(sock);
    WSACleanup();
    }

    Dodano po 1 [minuty]:

    Jeszcze to na samym początku. Dałem to w zakresie nazwy WS, bo mi kolidowało z typami z innych bibliotek

    namespace WS{

    #include <winsock2.h>
    #include <windows.h>
    WORD wersja = MAKEWORD( 2,0 );
    struct hostent *host;
    }

    Dodano po 4 [minuty]:

    I takie pytanko mam, czy za pomocą Winsocka można wysłać plik na stronkę, tak jak jest w TotalCommander itp ?
  • VIP Meritorious for electroda.pl
    Witam,
    Sagaceil wrote:
    czy za pomocą Winsocka można wysłać plik na stronkę, tak jak jest w TotalCommander itp ?

    Pliku nie wysyła się "na stronkę" tylko na serwer FTP. Oczywiście że można to zrobić ręcznie za pomocą Winsocka, ale pytanie - po co wymyślać na nowo koło ? Ja bym radził zamiast ręcznie programować gniazdka użyć curl ( a właściwie jego biblioteki - libcurl). Wieloplatformowe, funkcjonalne i sprawdzone w użyciu.

    Pozdrawiam, Krzysztof.
  • Level 29  
    Jeżeli korzystasz z Win32, M$ dostarcza gotowe biblioteki do obsługi FTP i HTTP. W tym pasywne FTP, HTTP i FTP przez proxy, etc. Szukaj "WinInet".
  • Level 11  
    OK, dzięki wielkie. Pogmyram w tym