Tutorijali - Mrežne C++ aplikacije

poruka: 57
|
čitano: 26.858
|
moderatori: Lazarus Long, XXX-Man, vincimus
+/- sve poruke
ravni prikaz
starije poruke gore
15 godina
protjeran
offline
Tutorijali - Programiranje mrežnih C++ aplikacija

U ovom topicu kanim stavljati tutorijale vezane za izradu mrežnih klijent-server aplikacija pisanih u C++u (Borlandova VCL biblioteka). Koristiti ću Turbo C++ 2006 Professional. Stoga, nećete moći te primjere pokrenuti s besplatnom Explorer verzijom (ukoliko dinamički ne alocirate mrežne komponente). Inače, svi tutorijali će moći biti pokrenuti i u C++ Builder razvojnim okruženjima (BCB 6, 2006, 2007). Koristiti će se Indy komponente.

 

Nadam se da ćete ovdje moći pronaći mnoštvo zanimljivih stvari, te da ću naći čim više vremena da to sve opišem. Biti će opisan rad sa sljedećim protokolima: TCP, UDP, SMTP, POP3, ICMP, FTP, TFTP, Telnet itd.., način rada s konekcijama, thread management, pooling itd., a dotaknuti ću se i nekih srodnih tema poput implementacija web browsera (internet explorer i Firefox) u aplikacije. Ako ima kakvih prijedloga ili što bi htjeli vidjeti samo pišite ;) Naravno, dobrodošli su i oni koji eventualno mogu doprinijeti svojim tutorijalima na ovom području.

 

A sad idem na pripremu prvog tutorijala :)

Poruka je uređivana zadnji put pet 8.8.2008 16:25 (Tracer).
Moj PC  
6 0 hvala 6
15 godina
protjeran
offline
TCP/IP - Chat aplikacija

Na nekim prethodnim forumima već sam se bio dotakao ove teme, pa ću ju i ovdje predstaviti. Naime, sada ću pokazati kako u (Turbo) C++u napraviti chat aplikaciju koja za prijenos podataka mrežom koristi TCP/IP skup protokola. Ono što je bitno za znati jest da TCP/IP skup protokola je jako precizan. Njime je osigurano da će paket stići do odredišta (ukoliko je to fizički moguće) i da će biti cjelovit, a ako je riječ o skupini paketa, oni će uvijek stići onim redoslijedom kojim su poslani! Za ovo se brine gomila pozadinskih servisa, te je ovaj skup protokola zbog toga gotovo najkorišteniji od svih, a u pozadini ga koriste i neki drugi protokoli poput FTP-a.


Pa krenimo... Otvorite Turbo C++ 2006 Pro ili C++ Builder 6, 2006, 2007...

Kreirajte novu VCL aplikaciju i neka forma (prozor) izgleda nekako kao na slici u prilogu.


http://img399.imageshack.us/img399/5752/tcpchatqs8.jpg

 

 

Pa objasnimo...

Za TCP chat su nam potrebne dvije komponente. Jedna server a druga klijent. Server će stalno biti aktivan i čekat poruke klijenata, a klijent će biti upaljen tj. spojen na server samo u trenutku zahtjeva tj. slanja poruke. Ono što je bitno kod servera jest odrediti port koji će server slušati, a klijent mora znati IP adresu servera i taj port. Nadam se da su vam sad jasne postavke HOST i Port. Host određuje IP adresu servera, a port kanal preko kojeg ide komunikacija.


Podešavanje servera je iznimno jednostavno. U Object Inspectoru trebate u bindings dijelu dodati željeni port i aktivirati server. Klijent treba znati IP adresu servera (host) i taj port koji server sluša. Sada je samo još potrebno definirati kako se šalju/primaju podaci tj. kojim redoslijedom.


U našoj chat aplikaciji klijentska strana će slati tekstualnu poruku. Da bi server primio takvu poruku on bi prvo trebao znati koliko je ona dugačka tj. koliko bajtova da očekuje na ulazu. Zato ćemo prvo poslati njenu duljinu, a tek onda njen sadržaj. Naravno, ovo nije jedini pristup kojim se može realizirati slanje poruke tekstualnog sadržaja. Postoje i druge metode.
 
Tekst (poruka) koju ćemo slati serveru se nalazi u komponenti ETekst, koja se nalazi odmah do gumba "Šalji". Prilikom klika na taj gumb klijent C1 se treba spojiti na server S1 te poslati mu poruku:
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    if(ETekst->Text.Length() == 0)
        return;
    C1->Host = EIP->Text; // odaberi host računalo
    C1->Connect();        // spoji se na server 
    C1->WriteInteger(ETekst->Text.Length()); // pošalji duljinu poruke
    C1->Write(ETekst->Text);  // pošalji sadržaj poruke
    C1->Disconnect();       // odspoji se od servera
}

 
Općenito, klijent se na server spaja samo u trenutku zahtjeva (slanja poruke). Na server ostaje spojen sve dok ne dobije odgovor od njega (ukoliko je ikakav odgovor zatražen), nakon čega odmah prekida konekciju. Gornja funkcija predstavlja sve ono što klijent mora napraviti sa svoje strane, a sada pogledajmo server stranu aplikacije.


void __fastcall TForm1::S1Execute(TIdPeerThread *AThread)
{
         // primi duljinu poruke      
    int duljina = AThread->Connection->ReadInteger();
         // primi poruku prethodne duljine
    AnsiString Poruka = AThread->Connection->ReadString(duljina);
 
    L1->Items->Add(Poruka);  //dodaj poruku u ListBox
    AThread->Connection->Disconnect();  // odspoji klijenta


Klijent može poslati zahtjev (poruku) bilo kada i iz bilo koje funkcije. Server kada prima zahtjeve (poruke) uvijek pokrene funkciju koja se izvršava na događaj OnExecute. U ovom slučaju, funkcija koja se izvršava na taj događaj se zove S1Execute, te za svakog klijenta tj. za svaki zahtjev se zasebno izvršava. Ukoliko pogledate sadržaj funkcije S1Execute možete primijetiti da server pri svakoj konekciji nekog klijenta uvijek istim redoslijedom čita podatke, i da je taj redoslijed isti onome po kojem klijent te podatke i šalje. Ta podudarnost mora postojati za svaku TCP klijent-server komunikaciju ukoliko želimo da se ona provede uspješno.
 
int duljina = AThread->Connection->ReadInteger();
AnsiString Poruka = AThread->Connection->ReadString(duljina);


Server prvo čita duljinu poruke, a tek onda njen sadržaj. Ovo se moglo izvesti i na način da server čita samo tekst funkcijom ReadLn, no na prethodni način smo sigurni da je server zaprimio točan broj bajtova poruke. Nakon primitka, poruka se prikazuje korisniku u ListBox komponenti L1, a tada server prekida vezu sa klijentom.


Sve što je sada potrebno jest pokrenuti aplikaciju, otvoriti firewall na podešenom portu (windowsi vas automatski to pitaju) i za host ukucati 127.0.0.1. Ukoliko ste sve uspješno podesili trebali bi moći sada razgovarati sa samim sobom. Ukoliko želite razgovarati s nekim drugim u mreži potrebno je samo pormjeniti IP adresu (host).

Poruka je uređivana zadnji put pet 8.8.2008 16:26 (Tracer).
Moj PC  
5 0 hvala 11
16 godina
neaktivan
offline
RE: TCP/IP - Chat aplikacija
Sve pet kolega i samo tako ,sve što se tiče C++-a i tutorijala koji posluže za učenje mogu samo najbolje reći!Ovaj tut koji si pokrenuo je nešto što ću vrlo rado čitati.
v_maxcpp
 
1 0 hvala 0
15 godina
protjeran
offline
RE: TCP/IP - Chat aplikacija

Zahvaljujem ;)

15 godina
protjeran
offline
UDP - Chat aplikacija

Sljedeći protokol kojeg ću spomenuti je UDP (User datagram protocol). Njega ću obraditi više reda radi, nego li iz praktičnosti. Naime, za razliku od TCP-a, ovaj protokol vam ne može garantirati niti da će paket stići od izvora do odredišta niti da će paketi stići u onom redoslijedu kojim su poslani. UDP samo garantira da će sadržaj biti vjerodostojan. Zašto se onda koristi? Zbog brzine...

 

UDP protokol ćete koristiti kad vam je bitan brz protok podataka mrežom, gdje pojedini gubitci i nisu toliko bitni. To je npr. na internetu kad slušate glazbu ili gledate film. Nije vam toliko bitno da vidite ili čujete svaki djelić filma koliko vam je bitno da sadržaj čim prije dođe do vas. Tako je isto i kada igrate igrice.. U multiplayer-u gdje je opterećenost servera dosta velika često se koristi UDP. Kada bi se u ovom slučaju koristio TCP tada bi i zbog najmanjeg zastoja u mreži svim igračima zamrznula slika dok ne bi dobili sve i jedan frame, a s UDP-om to bi se smatrao kao običan gubitak paketa i igra bi samo nastavila dalje bez zamrzavanja.

 

Kako bi napravili chat aplikaciju putem ovog protokola? Znamo da prvo želimo poslati duljinu poruke pa zatim njen sadržaj, no UDP nam ne garantira da će to stići baš tim redoslijedom, a to nam je jako bitno. Stoga, prvo ova dva podatka ćemo grupirati u jedan pomoću C strukture:

 

struct Paket
{
    int duljina;
    AnsiString Tekst;
};

 

Sada će UDP server ovo primiti kao jedinstven podatak i ne može se dogoditi da prvo stigne ili jedan ili drugi dio paketa, već samo cijeli ili nikako. Paket možemo poslati UDP klijentom npr. prilikom klika na gumb:

 

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    struct Paket Poruka;
    Poruka.duljina = EPoruka->Text.Lenght();
    Poruka.Tekst = EPoruka->Text;
    C1->Host = EHost->Text;
    C1->SendBuffer(&Poruka, sizeof(Poruka));  // šalje poruku
}

 

EPoruka - TEdit objekt koji sadrži tekst poruke

EHost - TEdit objekt koji sadrži IP adresu UDP servera

C1 - Indy UDP klijent

 

Naravno, prije svega ovoga potrebno je kao i u slučaju TCP-a definirati proizvoljni port preko kojeg se šalju podaci, a to možete i u Object inspectoru u svega dva klika (postavka port). Kada UDP server prima poruku od UDP klijenta onda se na serveru pokrene događaj OnUDPRead. Evo kako server zaprima gornji paket:

 

void __fastcall TForm1::S1UDPRead(TObject *Sender, TStream *AData,
      TIdSocketHandle *ABinding)
{
        struct Paket Pom;
        AData->Read(&Pom, sizeof(Pom));
        L1->Items->Add("<" + IntToStr(Pom.duljina) + "> " + Pom.Tekst);
}

 

UDP protokol svoju primjenu može naći na mnoštvu područja, a najviše pri prijenosu slike i zvuka, pa i u igrama. Ipak zastupljeniji je TCP/IP kojim možete realizirati puno sigurniju klijent-server komunikaciju bez ikakvog straha od gubitka podataka.

 

Poruka je uređivana zadnji put ned 10.8.2008 1:12 (Tracer).
15 godina
protjeran
offline
ICMP - Ping

ICMP (Internet Control Message Protocol) služi za slanje kontrolnih poruka te poruka o greškama. Primjerice, njime možemo provjeriti stanje nekog računala u mreži, tj. da li mu se može pristupiti i da li se od njega može dobiti ikakav odgovor. To realiziramo slanjem ICMP echo request poruke. Ako računalo prima tu poruku ono će vratiti odgovor također u tom istom obliku. Ovu poruku koristi i naredba ping, a pomoću ICMP protokola možemo realizirati i naredbu traceroute (tracert).

 

Prikažimo sada kako napraviti aplikaciju koja može pingati neko računalo ili web stranicu. Napravite novu VCL aplikaciju, te na njoj dodajte jednu Edit i jednu ListBox komponentu. Također, u Indy klijentima odaberite ICMP komponentu. Forma (prozor) bi trebao izgledati nekako kao na slici.

 

(vidi sliku)

 

ICMP komponenta odmah u sebi ima integriranu naredbu ping i zato je vrlo jednostavno s njome raditi. Jedino što je potrebno jest definirati Host-a i krenuti u akciju. Evo što se događa kada kliknemo na gumb PING:

 

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    ListBox1->Items->Clear();
    ICMP1->Host = EHost->Text;

    for(int i = 1; i <= 4; i++)
        try{
            ICMP1->Ping();
            Sleep(1000); // u razmacima od 1 sek..
            Application->ProcessMessages();
        }
        catch(...){
            ListBox1->Items->Add("Ping nije uspio!");
            Application->ProcessMessages();
        }
}

 

Kada pošaljemo zahtjev na Host računalo, i ako je ono u mogućnosti da nam odgovori naša ICMP komponenta će aktivirati OnReply događaj, a mi u njemu trebamo na adekvatan način primiti i obraditi pristigle podatke:

 

void __fastcall TForm1::ICMP1Reply(TComponent *ASender,
      const TReplyStatus &AReplyStatus)
{
    AnsiString Rezultat;
    Rezultat = "Primio " + IntToStr(AReplyStatus.BytesReceived) +
            " bajta od " + AReplyStatus.FromIpAddress +
            ", vrijeme = " + IntToStr(AReplyStatus.MsRoundTripTime) +
            " ms, ttl = " + IntToStr((int)AReplyStatus.TimeToLive);
    ListBox1->Items->Add(Rezultat);
}

 

Rezultat pokretanja ovog koda (npr. pritiskom na gumb) će dati isti rezultat kao da ste pokrenuli naredbu ping iz komandne linije. Odabrani Host će biti pingan 4 puta u razmaku po jednu sekundu, a rezultat pinganja će biti prikazan u listbox-u. Npr. evo što bi se eventualno prikazalo da smo iz ove aplikacije pingali www.google.hr:

 

Primio 72 bajta od 209.85.135.147, vrijeme = 37 ms, ttl = 243
Primio 72 bajta od 209.85.135.147, vrijeme = 31 ms, ttl = 243
Primio 72 bajta od 209.85.135.147, vrijeme = 30 ms, ttl = 243
Primio 72 bajta od 209.85.135.147, vrijeme = 29 ms, ttl = 243

 

Vidite i sami kako je ovo zaista jednostavno, i lagano možete pisati aplikacije koje mogu odjednom pingati i cijele podmreže ili liste IP adresa.

Poruka je uređivana zadnji put uto 12.8.2008 20:59 (Tracer).
Moj PC  
2 0 hvala 2
15 godina
protjeran
offline
RE: Tutorijali - Programiranje mrežnih C++ aplikac

eh... kad bih ja barem bio tako pametan da sve to shvatim...

- all e can do is prey, for better tomorrow...  

92% tinejđera sluša turbo-folk, a ako si jedan od onih koji slušaju pravu glazbu, kopiraj si ovo u potpis (fable 2)
15 godina
protjeran
offline
RE: Tutorijali - Programiranje mrežnih C++ aplikac
jack_of_blades kaže...

eh... kad bih ja barem bio tako pametan da sve to shvatim...

- all e can do is prey, for better tomorrow...  

 Uvijek možeš pitati ako ti nešto nije jasno.
15 godina
protjeran
offline
SMTP - slanje email poruke

U C++ Builder-u/Turbo C++u možemo napraviti aplikacije za primanje i slanje elektroničke pošte. U tu svrhu koristili bi POP3 i SMTP protokole i pripadne klijent-server komponente. Pošto nam je slanje email-a iz naše aplikacije puno važnije nego li primanje i pregledavanje, sada ću objasniti kako napraviti C++ aplikaciju koja korištenjem SMTP protokola šalje email. U email-u će osim teksta biti poslan i attachment (prilog), a kao i do sada koristiti ću Indy komponente.

Napravite novu VCL aplikaciju i na formu (prozor) dodajte komponente kao na slici (pogledaj sliku). Da bi uspjeli poslati e-mail poruku moramo koristiti dvije Indy komponente (TIdSMTP i TIdMessage), a ukoliko se u e-mail poruci nalazi prilog (attachment) onda trebamo još jednu (TIdAttachment). Prva komponenta nam služi za uspostavi veze s SMTP serverom. Drugom definiramo elemente e-mail poruke (tko šalje, prima, naslov, tekst...), dok ne-vizualnom komponentom TIdAttachment se koristimo kada uz poruke šaljemo priloge (datoteke). Pogledajmo:

void __fastcall TForm1::Button1Click(TObject *Sender)
{      
    TIdAttachment *Prilog;
 
    // smtp server
    SMTP1->Host = ESMTP->Text;
    SMTP1->Port = StrToInt(EPort->Text);
 
    // e-mail poruka
    M1->From->Address = ESalje->Text;
    M1->Recipients->EMailAddresses = EPrima->Text;
    M1->Subject = ESubject->Text;
    M1->Body->Add(Memo1->Text);
 
    // prilog (attachment)
    if(EPrilog->Text.Length() > 0)
        Prilog = new TIdAttachment(M1->MessageParts, EPrilog->Text);
    try
    {
        SMTP1->Connect();
        SMTP1->Send(M1);
    }
    catch(Exception &e){
        MessageBox(0, e.Message.c_str(),0,0);
    }
    SMTP1->Disconnect();
    if(EPrilog->Text.Length() > 0)
        delete Prilog;
}

Potrebno je podesiti postavke svih triju komponenti. Tako za TIdSMTP klijent komponentu moramo definirati Host i Port, dok TIdMessage komponentom definiramo e-mail poruku. Osim e-mail adrese na koju šaljemo poruku trebamo navesti i svoju e-mail adresu da bi na tu poruku druga strana mogla odgovoriti.

Gornji kod je sve što je potrebno da bi se poslala e-mail poruka, i na vama je samo da ispravno definirate ulazne podatke poput hosta itd.. Na ovaj način možete omogućiti aplikaciji da npr. automatski pri grešci šalje mail s opisom greške administratoru, tako da se može lakše održavati i sama aplikacija.

Poruka je uređivana zadnji put uto 26.8.2008 22:28 (Tracer).
Moj PC  
3 0 hvala 3
15 godina
protjeran
offline
FTP klijent

FTP (File Transfer Protocol) radi isključivo pomoću TCP/IP skupa protokola. Najčešće se koristi za prijenos datoteka putem mreže i vrlo je popularan jer je i neovisan o tipu operacijskog sustava. Po podrazumijevanim postavkama FTP koristi portove 20 (za podatke) i 21 (za naredbe), a može raditi na dva načina tj. kao aktivni i pasivni.

Aktivni FTP klijent će zauzeti neki slučajni port (>1024), poslati ga zajedno sa svojom IP adresom serveru i čekati da on uspostavi vezu kroz svoj odredišni port (20). Većina FTP klijenata radi na ovakav način, i za ove potrebe vaš vatrozid (firewall) najčešće mora imati otvoren određeni opseg portova kako bi se osigurala uspješna komunikacija.

Pasivni način rada je kada server zauzima slučajni port (>1024), te ga zajedno sa svojom IP adresom šalje klijentu i čeka njegovu konekciju. U ovom slučaju i klijent i server će koristiti portove iznad 1024. Također, postoji i napredni pasivni način rada a to je kada server šalje samo broj porta, dok se IP adresa podrazumijeva kao nepromijenjena.

 

Indy komponente možemo upotrijebiti za izradu FTP klijent-server aplikacija, a sada ćemo prikazati kako napraviti klijent aplikaciju. Od osnovnih operacija prikazati ćemo kako se spojiti na FTP server, doznati strukturu direktorija (mapa) i datoteka, napraviti download i upload datoteka, te kako izbrisati datoteku sa FTP servera. Za potrebe ovog primjera poželjno je imati pristup nekom FTP serveru, ili da sami instalirate neku FTP server aplikaciju na lokalnom računalu.

 

(pogledati sliku)

 

Kreirajte novu VCL aplikaciju i na formu (prozor) dodajte Indy TIdFTP komponentu. Ona će predstavljati FTP klijent, dok za spajanje na FTP server zahtjeva njegovu IP adresu te ispravno korisničko ime i lozinku. Također, u primjeru na slici je pomoću TCheckBox komponente korisniku ostavljena opcija da se spoji u aktivnom ili pasivnom modu, dok samo spajanje se izvršava klikom na gumb.

 

void __fastcall TForm1::BConnectClick(TObject *Sender)
{
    if(FTPC1->Connected()) {
        Application->MessageBoxA("Vec ste spojeni na ovaj FTP server!",
                         "Greska", 0 | MB_ICONSTOP);
        return;
    }
    FTPC1->Host = EHost->Text;
    FTPC1->Username = EUsername->Text;
    FTPC1->Password = EPassword->Text;
    FTPC1->Passive = CPassive->Checked;
    FTPC1->Connect();  // spoji se na FTP server!

    TStrings* LS;
    LS = new TStringList();
    FTPC1->List(LS);

    // ispis direktorija (mapa)
    for(int i = 1; i < FTPC1->DirectoryListing->Count; i++)
        if (FTPC1->DirectoryListing->Items[i]->ItemType == ditDirectory)
            LDir->Items->Add(FTPC1->DirectoryListing->Items[i]->FileName);
    // ispis datoteka
    for(int i = 1; i < FTPC1->DirectoryListing->Count; i++)
        if (FTPC1->DirectoryListing->Items[i]->ItemType == ditFile)
            LDat->Items->Add(FTPC1->DirectoryListing->Items[i]->FileName);
    delete LS;
}

Za potrebe spajanja na FTP server koristimo ovu funkciju. Prvo što ćemo provjeriti jest da li smo slučajno već spojeni na server, te nakon toga FTP klijentu predati sve potrebne podatke za spajanje. Samo spajanje vršimo funkcijom Connect, koja je sastavni dio Indy FTP klijent komponente.

 

U prvoj TListBox komponenti nalaziti će se samo direktoriji, a u drugoj samo datoteke. Da bi omogućili "šetanje" kroz direktorije na FTP serveru prvoj TListBox komponenti smo dodali OnDblClick događaj. Naime, kada se u toj komponenti inicijalno nakon spajanja bude nalazio popis direktorija u root-u FTP servera, nakon dvoklika na bilo kojeg od njih ući ćemo u njega te opet iznova generirati listu pod-direktorija i datoteka u njemu. Na taj način možemo pristupiti svim direktorijima i datotekama na FTP serveru.
       
void __fastcall TForm1::LDirDblClick(TObject *Sender)
{
    try{
        FTPC1->ChangeDir(LDir->Items->Strings[LDir->ItemIndex]);
    }
    catch(EOleException *E)    {
        Application->MessageBoxA(E->Message.c_str(),
                         "Greska", 0 | MB_ICONSTOP);
        return;
    }
    TStrings* LS;
    LS = new TStringList();
    FTPC1->List(LS);

    LDir->Items->Clear();
    LDat->Items->Clear();
    for(int i = 1; i < FTPC1->DirectoryListing->Count; i++)
        if (FTPC1->DirectoryListing->Items[i]->ItemType == ditDirectory)
            LDir->Items->Add(FTPC1->DirectoryListing->Items[i]->FileName);
  
    for(int i = 1; i < FTPC1->DirectoryListing->Count; i++)
        if (FTPC1->DirectoryListing->Items[i]->ItemType == ditFile)
            LDat->Items->Add(FTPC1->DirectoryListing->Items[i]->FileName);
    delete LS;
}

Za pristup nekom direktoriju koristimo funkciju ChangeDir, a možemo ju upotrijebiti na razne načine. Npr.:

FTPC1->ChangeDir("ABC");    // pristupi direktoriju ABC
FTPC1->ChangeDir("..");    // vrati se u prethodni direktorij

 

I sada dolazimo do najvažnijih stvari tj. kako napraviti download i upload datoteka. Za te operacije FTP klijent komponenta koristi funkcije Get i Put. Primjerice;



void __fastcall TForm1::BDownloadClick(TObject *Sender)
{
        SaveDialog1->FileName = LDat->Items->Strings[LDat->ItemIndex];
        if(SaveDialog1->Execute() != true)
            return;
        FTPC1->TransferType = ftBinary;
        FTPC1->Get(LDat->Items->Strings[LDat->ItemIndex],
                 ExtractFileName(SaveDialog1->FileName), true);
}


Prilikom operacija skidanja i stavljanja datoteka možemo odrediti i tip prijenosa tj. da li će biti binarni ili ASCII. Prvi se koristi za bilo kakve oblike neformatiranih datoteka, dok drugi ukoliko je riječ o čistom ASCII znakovlju. U pravilu, binarna metoda će u gotovo svim slučajevima zadovoljiti sve potrebe. Funkcije Get i Put obje rade na isti način. Npr.

FTPC1->Get("Datoteka.txt", "Datoteka_download.txt", true);
Ovim pozivom funkcije Get vršimo skidanje (download) datoteke Datoteka.txt, te ju spremamo lokalno pod imenom Datoteka_download.txt. Zadnjim parametrom određujemo da li je skidanje datoteke moguće kasnije nastaviti ukoliko se prilikom prijenosa dogodi greška (true) ili da se skidanje datoteke uvijek vrši iznova (false). Na isti način radi i funkcija Put, pa ju sami pokušajte implementirati u ovu aplikaciju.

Moj PC  
2 0 hvala 2
16 godina
neaktivan
offline
Tutorijali - Mrežne C++ aplikacije

Svaka cast Traceru na ulozenom trudu. Odlicni tutoriali.

Da odem malo u OT: ako mislite na server strani slagat pasivni FTP, postoji velika mogucnost da ce vam router od vaseg ISP-a blokirat promet na default listening portu (21) (kod PASV komande), pa ga je pozeljno dici na nekom drugom portu.

 
0 0 hvala 0
15 godina
protjeran
offline
RE: Tutorijali - Mrežne C++ aplikacije
Mithrandir kaže...

Svaka cast Traceru na ulozenom trudu. Odlicni tutoriali.

Da odem malo u OT: ako mislite na server strani slagat pasivni FTP, postoji velika mogucnost da ce vam router od vaseg ISP-a blokirat promet na default listening portu (21) (kod PASV komande), pa ga je pozeljno dici na nekom drugom portu.

Hvala.

Na poslu imam FTP server na jednom računalu sa statičkom IP adresom i radi bez problema na bilo kojem modu. Iako, moguće je da i to blokiraju. No uglavnom to ovisi o infrastrukturi u kojoj se nalaziš. Obično se uvijek nalazi jedna mreža unutar firewall-a a druga van. Ako si unutar firewall-a onda si vjerovatno blokiran, a ako si na vanjskoj mreži onda ne bi trebao imati problema.
Poruka je uređivana zadnji put pon 15.9.2008 1:28 (Tracer).
16 godina
neaktivan
offline
Tutorijali - Mrežne C++ aplikacije

Odlična stvar majstore. Svaka čast. Baš se u zadnje vrijeme lomim u Borland Builderu. Samo tako nastavi!

 

P.S. Imaš kakvih linkova za tutoriale za Borland Builder 6?

FOXCONN P9657AA; INTEL CORE 2 DUO E4300 1.8GHz; ASUS EN7300GT SILENT @ 500/930; 2 GB DDR2 RAM TwinMOS 667MHz; HDD 160 GB WD; LENOVO L171 17";
Moj PC  
0 0 hvala 0
15 godina
protjeran
offline
Tutorijali - Mrežne C++ aplikacije

Imaš puno tutorijala po netu a za početak pogledaj ovo

 

http://www.functionx.com/bcb/index.htm

 

Ako te nešto specifično zanima pitaj pa ću se potruditi da odgovorim.

Moj PC  
0 0 hvala 0
16 godina
neaktivan
offline
RE: Tutorijali - Mrežne C++ aplikacije
Tracer kaže...
Na poslu imam FTP server na jednom računalu sa statičkom IP adresom i radi bez problema na bilo kojem modu. Iako, moguće je da i to blokiraju. No uglavnom to ovisi o infrastrukturi u kojoj se nalaziš. Obično se uvijek nalazi jedna mreža unutar firewall-a a druga van. Ako si unutar firewall-a onda si vjerovatno blokiran, a ako si na vanjskoj mreži onda ne bi trebao imati problema.
 Sa statickom IP adresom ne bi trebalo bit problema, obicno je problem s kompovima iza NAT routera... Nazalost, taj router ne smijem mijenjat, jer Iskon ne dopusta nijedan drugi. A sto se tice firewall-a, pa nije problem propustit portove :)
15 godina
protjeran
offline
Tutorijali - Integracija web browsera u aplikacije

Sama aplikacija može imati mogućnost pristupa internetu, bilo da je riječ o korisniku "nevidljivoj" komunikaciji putem nekih protokola, klijent-server modelu ili sl., do samog prikaza web stranica. Da bi naša aplikacija mogla prikazati sadržaj neke web stranice možemo koristiti za to već postojeće komponente. A to su MS Explorer i Firefox komponente.

 

MS Explorer komponente su u većini slučajeva ugrađene u razvojna okruženja, no u praksi se pokazuju nepouzdane. Postupak učitavanja web stranice je jako spor, dok samo učitavanje ne mora nužno biti čak niti uspješno. Za razliku od njih Firefox komponenta je i pouzdana i brza, pa ću se sada osvrnuti na nju. Da bi ju mogli koristiti trebate imati neki bolji IDE. Npr.:

 

Visual Basic.NET

Visual Basic 6

Visual C++

Delphi

C++ Builder

 

Prvo što morate napraviti jest s interneta skinuti i instalirati firefox komponentu za svoj IDE:

 

http://www.iol.ie/~locka/mozilla/control.htm

 

Detaljna uputstva možete pronaći na gorenjem linku. Poanta je da nakon skidanja i raspakiravanja arhive registrirate firefox komponentu regsvr32 programom (pogledati uputstva na web-u), a tada ju možete integrirati u svoj IDE (najlakše upotrebom VB-a). Ono što ćete dobiti jest komponentu koja odmah daje mogućnost prikaza neke web stranice, a dalje je na vama da napravite ostatak browser-a (ukoliko radite browser).

 

Primjerice, evo kako se ova firefox komponenta koristi u delphi-ju:

 

http://www.paranoia.clara.net/articles/taming_the_lizard_with_delphi.html

 

Tu vam je jasno u slikama prikazano kako to izgleda, kako se radi učitavanje web stranice, namještaju određene postavke itd.. Sad je sve na vama da li ćete radit svoj novi browser ili ne.

Poruka je uređivana zadnji put čet 12.3.2009 13:44 (Tracer).
Moj PC  
0 0 hvala 0
15 godina
offline
Tutorijali - Mrežne C++ aplikacije

Zgodan tut... kad sam prije desetak godina i poceo sa programiranjem radio sam u Borland C++ builderu i moje prve aplikacije (Hello world) su bile ovog tipa. Cak sam napravio Mail bomber pa mi je T-Com blokirao racun :) :)

 

Takodjer sam u BC++ radio maturalni, takodjer mrezno programiranje, nesto tipa nadgledanje racunala preko mreze (nastao kao derivat prijasnjeg projekta mog backdora tipa OpenOrifice). U svakom slucaju na takvim projektima sam ucio osnove programiranja, imao sam poprilicnu fasciklu isprintanog helpa, namucio se ko sivonja. Ali isplatilo se, kad naucis osnove jednog programiranja i najvaznije, kada nauci RAZMISLJATI "kao racunalo" onda ti je skoro svaki programski jezik ista stvar, malo drugacija sintaksa ali filozofija je ista (tu nebih ubrojao logicke programske jezike tipa prolog i slicno jer oni imaju kompletno drugaciju filozofiju i "obrnutu" sintaksu).

 

Svaka cast Tracer... keep up the good work!

I'm going woo woo
Poruka je uređivana zadnji put čet 12.3.2009 14:07 (tnakir).
 
0 0 hvala 0
15 godina
protjeran
offline
Tutorijali - Mrežne C++ aplikacije

Pa super. Onda i ti možeš ubaciti pokoji tut o mrežnom programiranju u C++ Builderu. I zahvaljujem.

Poruka je uređivana zadnji put čet 12.3.2009 14:19 (Tracer).
Moj PC  
0 0 hvala 0
15 godina
offline
Tutorijali - Mrežne C++ aplikacije

Mogao bih iako si veliku vecinu (osnove naravno) pokrio... Mozda ne net aplikacije nego nesto drugo... budem cim uhvatim vremena...

I'm going woo woo
 
0 0 hvala 0
15 godina
offline
RE: Tutorijali - Mrežne C++ aplikacije
tnakir kaže...

Zgodan tut... kad sam prije desetak godina i poceo sa programiranjem radio sam u Borland C++ builderu i moje prve aplikacije (Hello world) su bile ovog tipa. Cak sam napravio Mail bomber pa mi je T-Com blokirao racun :) :)

 

Takodjer sam u BC++ radio maturalni, takodjer mrezno programiranje, nesto tipa nadgledanje racunala preko mreze (nastao kao derivat prijasnjeg projekta mog backdora tipa OpenOrifice). U svakom slucaju na takvim projektima sam ucio osnove programiranja, imao sam poprilicnu fasciklu isprintanog helpa, namucio se ko sivonja. Ali isplatilo se, kad naucis osnove jednog programiranja i najvaznije, kada nauci RAZMISLJATI "kao racunalo" onda ti je skoro svaki programski jezik ista stvar, malo drugacija sintaksa ali filozofija je ista (tu nebih ubrojao logicke programske jezike tipa prolog i slicno jer oni imaju kompletno drugaciju filozofiju i "obrnutu" sintaksu).

 

Svaka cast Tracer... keep up the good work!

offtopic :  Sad si me odmah sjetio na faks, to smo radili na faksu, bio je zanimljiv jezik, iako mi se taj način "programiranja" nije baš sviđao Smijeh
"Genius might be the ability to say a profound thing in a simple way." Charles Bukowski
15 godina
offline
Tutorijali - Mrežne C++ aplikacije

Zanimljiv?!?! Meni je uvik bija odvratan i odbojan i u tadasnje vrijeme za mene neprimjenjiv :) Mlad lud... Sad san nesto stariji ali mi je svejedno odbojan radi obrnute sintakse. Kad sam pisao kod u prologu morao sam razmisljati, a kada kodiram u C# ili VB.Netu kod izlazi sam od sebe ko da pricam hrvatski...

I'm going woo woo
 
0 0 hvala 0
16 godina
neaktivan
offline
Tutorijali - Mrežne C++ aplikacije

Mala digresija, ali Tracer, ne vidim nikakvu svrhu (nisam čitao tutorijale) u podučavanju korištenja nekakvih komponenti ili nečeg specifičnog. Zašto se nisi uhvatio Windows/Linux socket programiranja u C++u bez ikakvih Borland dodataka?

Jer ovako su ti tutorialji više-manje beskorisni za nekoga tko se ne želi vezati uz VCL (ako koristiš taj framework).

LOL @ http://www.youtube.com/watch?v=Y_uCjnuY9D4
Poruka je uređivana zadnji put pet 13.3.2009 10:13 (naxeem).
Moj PC  
0 0 hvala 0
15 godina
protjeran
offline
Tutorijali - Mrežne C++ aplikacije

Ove (Indy) komponente o kojima ovdje pišem su multiplatformske. Uzmeš svaki ovaj program koji je rađen u C++ Builderu i prevedeš ga u Kylix-u 3 pod Linuxom i dobiješ Linux aplikaciju koja radi preko Qt-a. Sve komponente u konačnici rade na low-level nivou, samo što se kroz komponente pojednostavljuje upotreba tih funkcionalnosti. Primjerice, nema smisla raditi u assembleru Windows aplikaciju kada za to postoje puno lakša rješenja tj. razvojna okruženja. Tako isto i kada je riječ o komponentama. Možeš ti uvijek ručno npr. raditi CAB kompresiju ili dekompresiju upotrebom CAB SDK, ali to nema previše smisla kada postoje gotove komponente kojima je to puno više pojednostavljeno.

 

Zato i postoje različite biblioteke poput MFC, VCL, CLX, wx... pa je na tebi da si izabereš, a ovo je tutorijal za one koji su se odlučili za VCL Osmijeh

Poruka je uređivana zadnji put pet 13.3.2009 11:13 (Tracer).
Moj PC  
0 0 hvala 0
16 godina
neaktivan
offline
Tutorijali - Mrežne C++ aplikacije

Da, točno, ali u konkretnom slučaju u kojem je cilj edukacija, potrebno je ciljanog čitatelja educirati o samoj mehanici rada socketa, načinu prijenosa podataka (bufferi, streamovi itd.) i samim osnovama konverzije tipova, pretvaranja i sl. što je potrebno kod mrežne komunikacije.

Nije problem koristiti komponente kada imaš nekakav gotovi RPC ili neki drugi sistem kao remoting i sl. pa npr. pošalješ blok teksta sa Tracer.SendTextToServer(text) ili Tracer.SendObject(MojaStruktura).

Mišljenja sam da VCL ne spada u područje "tutoriala" jer realno nema neke filozofije u korištenju niti jednog paketa kada je sama logika poznata.

 

Kada smo kod toga, postat ću jedan zadatak u Javi; stvar je vrlo slična svakoj socket komunikaciji, a možeš ga ako hoćeš riješiti u C++-u i Javi. Zanimaju me rješenja tog zadatka i ideje koje ljudi dobiju.

LOL @ http://www.youtube.com/watch?v=Y_uCjnuY9D4
Moj PC  
0 0 hvala 0
15 godina
protjeran
offline
RE: Tutorijali - Mrežne C++ aplikacije

Sama teorija rada protokola je stvar za sebe. Ja ovdje pišem o njihovoj programskoj realizaciji upotrebom VCL biblioteke. Osoba koja radi mrežne aplikacije već bi trebala imati teoretsku podlogu kako koji protokol radi, barem da na osnovu toga odabere odgovarajući protokol za svoje klijent-server rješenje. I opet, u ovim tutorijalima sam pokrio barem osnovne karakteristike protokola o kojima sam pisao. Jasno je napisano kako radi TCP, UDP, FTP, ICMP... i čemu služe. I po mom mišljenju to je dovoljno. Tko želi ulaziti u detalje cijele priče onda već ulazi u sfere koje se ne tiču VCL-a jer one baš i nisu nužno potrebene za korištenje i razumijevanje ovih komponenti. Programer može iskoristiti sve funkcionalnosti određenog protokola bez da mora znati sve detalje rada samog protokola i to je poanta cijele priče.

 

I tako isto onda možeš reći da nema smisla učiti bilo koju biblioteku već se samo orjentirati na bazična i krajnja low-level rješenja. U tom slučaju i najjednostavnije aplikacije bi imale kilometre programskog koda. To u praksi nije isplativo niti vremenski zbog realizacije projekta niti u pogledu održavanja tog koda.

 

I može, stavi zadatak.

 

 

15 godina
protjeran
offline
Tutorijali - Mrežne C++ aplikacije - Downloading..

Dalje nastavljam ovaj tutorijal o mrežnim aplikacijama, ali ne na dosadašnji način već preko youtube videa :) Znači, moj prvi youtube video o programiranju mrežnih aplikacija:

 

 

Tema:
Kako napraviti aplikaciju koja će skinuti (napraviti download) neke datoteke sa interneta?

 

Video sam napravio na engleskom jeziku da bude maksimalno upotrebljiv svima u svijetu koji eventualno žele to naučiti, te unaprijed se ispričavam na svom šlampavom engleskom (ako će već nekoga posebno smetati). Video je rađen kao HD s rezolucijom 1280x720 te je najbolje ga pokrenuti u full screen-u (720p).


Uživajte ;)

Poruka je uređivana zadnji put pet 12.3.2010 11:03 (Tracer).
Moj PC  
1 0 hvala 2
15 godina
offline
Tutorijali - Mrežne C++ aplikacije

Odlican tut!!!

 

Sad ti je gotovo, sad ces morat svako malo izbacivat nove :)

 

Zapravo imam jednu zamjerku: nabavi mikrofon sa spuzvicom :)

 

Eto to je to :)

I'm going woo woo
Poruka je uređivana zadnji put sub 20.2.2010 14:05 (tnakir).
 
1 0 hvala 0
15 godina
protjeran
offline
RE: Tutorijali - Mrežne C++ aplikacije
tnakir kaže...

Odlican tut!!!

 

Sad ti je gotovo, sad ces morat svako malo izbacivat nove :)

 

Zapravo imam jednu zamjerku: nabavi mikrofon sa spuzvicom :)

 

Eto to je to :)

Hvala ;)

 

Ma morao sam ga malo boostati da budem siguran da će se sve čuti kako spada. Budem kasnije bolje kalibrirao ;)

14 godina
neaktivan
offline
Tutorijali - Mrežne C++ aplikacije

Taman mi je trebalo ovo!

 

Fala i sad jedini je problem što moraš snimit još puuno ovakvih korisnih filmića!

Nista nije sveto sve je bruto i neto, sve je zabava!
Moj PC  
0 0 hvala 0
16 godina
moderator
offline
RE: Tutorijali - Mrežne C++ aplikacije
Tracer kaže...

Ma morao sam ga malo boostati da budem siguran da će se sve čuti kako spada. Budem kasnije bolje kalibrirao ;)

Ne znam cime radis - ako se ogranicavas na besplatne programe, izvadi zvuk van iz datoteke u obliku WAV-a, otvori ga u Audacityju i u njemu se poigraj normalnizacijom i kompresorom (imas ih u izborniku Effects). Compressor ti omogucava da dosta poglasnis zvuk, a da ne ode u clipping (dakle, da nema krckanja).

 

Lijep tutorijal. Samo, ja bih te dao streljati zbog imenovanja - ajde, H1 jos mogu prozvakati, P1 vise ne, a x za FileStream ni u kom slucaju! Namigiva Bez obzira sto je to mali tutorijal koji se bavi samo jednom stvari... fsDownload ili fsDownloadedFile bi recimo bio dobar naziv varijable, jos bi se dalo prozvakati fs, ali x!?

 

Poruka je uređivana zadnji put pon 22.2.2010 9:48 (mbaksa).
Nova poruka
E-mail:
Lozinka:
 
vrh stranice