|
|
|
|
|
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.
|
|
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.
Hodnocení článku |
1 |
2 |
3 |
4 |
5 Aktuální známka: 2.60 (Počet známek: 4241)
|
|
|
|
|
|