[Grafika] [WebTip] [Fotografování] [Galerie] [MujMac] [Printing]
  Redakce: info (at) builder.cz   Inzerce: reklama (at) grafika.cz
Diskuzní fóra
.Net (58811)
ASP (1464)
ActiveX (163)
Allegro (126)
Assembler (3699)
C++ Builder (21656)
C/C++ (39174)
Databáze (27980)
Delphi (71030)
DelphiX (1575)
DirectX (1427)
Java (34885)
JavaScript (11036)
Matematické programy (1906)
OOP a UML (579)
OpenGL (6612)
Php (61391)
PowerBuilder (457)
Problémy a algoritmy (8579)
Programování v Linuxu (1837)
Právo a programování (3146)
Python (1076)
Ruby (128)
Visual Basic (11529)
Visual C++ (12469)
Wap (56)
Web (10262)
Web servery (5238)
Win32 (12737)
Windows CE (830)
XML/XSL (1655)
Textová inzerce
Služby Builder.cz
  • Bazar - koupím(0)
  • Bazar - prodám(0)
  • Hledám práci(0)
  • Nabízíme práci(0)
  • Projekty(0)
  • TCP klient v Linuxu
    Dnes se naučíme vytvářet jednoduchého TCP klienta v operačním systému Linux. Naučíme se jak vytvářet soket, jak navázat spojení se serverem, jak přijmout a odeslat data. Vysvětlíme si pojem soket a ukážeme si funkce socket, connetc, send, recv, close.
    Sokety a C++
    Předchozí díl: Překlad doménových jmen v MS Windows

    Následující díl: TCP klient v MS Windows

    Obsah článku

    - TCP klient v Linuxu
    - Ukázkový příklad
    Autor: Radim Dostál
    Rubrika: C/C++
    Publikováno: 20.12. 2002
     Tisk článku
    Poslat odkaz emailem
     

    Ukázkový příklad - TCP klient v Linuxu

    Nyní si vytvoříme jednoduchý příklad. Vytvoříme program, který naváže spojení se serverem, odešle mu textový řetězec a přijme jiný textový řetězec. Poté server spojení ukončí. Parametry programu budou adresa vzdáleného počítače (IP adresa nebo doménové jméno) a číslo portu. V příkladu používám šablonu string. Umožňuje v C++ pohodlnější práci s řetězci než pole znaků. Více informací o šabloně je v článku Řetezce v C++.

    #include <iostream>
    #include <string>
    #include <unistd.h>
    #include <netdb.h>
    #include <netinet/in.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    
    #define BUFSIZE 1000
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        string text("Ahoj\n");      // Odesílaný a přijímaný text
        hostent *host;              // Vzdálený počítač;
        sockaddr_in serverSock;     // Vzdálený "konec potrubí"
        int mySocket;               // Soket
        int port;                   // Číslo portu
        char buf[BUFSIZE];          // Přijímací buffer
        int size;                   // Počet přijatých a odeslaných bytů
        if (argc != 3)
        {
            cerr << "Syntaxe:\n\t" << argv[0]
                      << " " << "adresa port" << endl;
            return -1;
        }
        port = atoi(argv[2]);
        // Zjistíme info o vzdáleném počítači
        if ((host = gethostbyname(argv[1])) == NULL)
        {
            cerr << "Špatná adresa" << endl;
            return -1;
        }
        // Vytvoříme soket
        if ((mySocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1)
        {
            cerr << "Nelze vytvořit soket" << endl;
            return -1;
        }
        // Zaplníme strukturu sockaddr_in
        // 1) Rodina protokolů
        serverSock.sin_family = AF_INET;
        // 2) Číslo portu, ke kterému se připojíme
        serverSock.sin_port = htons(port);
        // 3) Nastavení IP adresy, ke které se připojíme
        memcpy(&(serverSock.sin_addr), host->h_addr, host->h_length);
        // Připojení soketu
        if (connect(mySocket, (sockaddr *)&serverSock, sizeof(serverSock)) == -1)
        {
            cerr << "Nelze navázat spojení" << endl;
            return -1;
        }
        // Odeslání dat
        if ((size = send(mySocket, text.c_str(), text.size() + 1, 0)) == -1)
        {
            cerr << "Problém s odesláním dat" << endl;
            return -1;
        }
        cout << "Odesláno " << size << endl;
        // Příjem dat
        text = "";
        while ((size = recv(mySocket, buf, BUFSIZE, 0)) != -1) 
        {        
            cout << "Přijato " << size << endl;
            text += buf;
        }
        // Uzavřu spojení
        close(mySocket);
        cout <<  endl << text << endl;
        return 0;
    }
    

    Tento příklad je možné si stáhnout jako ukázku. Ke stažení je toho tentokrát ale více. Druhý příklad je program, který vlastně dělá stejnou činnost jako tento, ale nepoužívá funkce send a recv, ale místo nich používá fscanf a fprintf. I pomocí těchto funkcí lze posílat a přijímat data. Tím máme hotového Linuxového klienta. Teď by to pro názornou ukázku chtělo mít k dispozici server, ke kterému se klient bude moci připojit. Server si napíšeme v příštích článcích. Věřím, že je mnoho takových, kteří si chtějí vyzkoušet klienta teď hned. Chtělo by to nějaký server na rychlé vyzkoušení. Proč ale server narychlo psát, když na Internetu je jich spousta (například WWW servery). Proto třetí příklad ke stažení je příklad, který stáhne WWW stránku (tento článek) a uloží ji na disk. Používám protokol HTTP, což je textový protokol, který běží nad TCP/IP. WWW servery (pokud není uvedeno jinak) očekávají spojení na portu 80. HTTP protokolem se v seriálu zabývat nebudeme.

    Příklady

    V příštím článku vytvoříme TCP klienta pod MS Windows®. Opět zdrojový text bude nápadně podobný tomuto. Nebude ale úplně stejný. A v článku, který bude následovat poté, začneme vytvářet jednoduchý TCP server.


    << Předcházející kapitola (TCP klient v Linuxu)  


    Zpět na začátek stránky

    Autor: Radim Dostál
    Klikni pro další články autora

    Hodnocení článku
    1 | 2 | 3 | 4 | 5
    Aktuální známka: 2.60
    (Počet známek: 4241)

    Komentáře k článku
    Jerry10.03.9:45‘ostream_iterator’ was not declared in this scope
    Jerry12.03.10:55RE: ‘ostream_iterator’ was not declared in this scope
    Dostál08.01.9:29Omluva za chybu
    optik27.12.22:02omluva
    optik25.12.17:34fdopen a pak fputs fprintf
    Dostál26.12.1:08RE: fdopen a pak fputs fprintf
         





    info@builder.cz
    Vydává Grafika Publishing, s.r.o.
    Copyright (c) 1997-2002 Všechna práva vyhrazena