Sobes.tech
Middle

Použili ste štandardné knižnice alebo ste vyvinuli vlastné riešenia pre prácu s sieťou?

sobes.tech AI

Odpoveď od AI

Používal ako štandardné knižnice, tak aj vlastné riešenia v závislosti od projektu a požiadaviek.

Štandardné knižnice:

  • Sockets API (BSD Sockets): Nízkoúrovňové API na prácu s TCP/IP. Používa sa na vytváranie socketov, nastavovanie spojení, odosielanie a prijímanie dát.
  • Boost.Asio: Krosplatformná knižnica na asynchrónny vstup/výstup, často používaná na sieťové operácie vďaka podpore socketov, časovačov a iných sieťových primitív.
  • libcurl: Klientska knižnica na prenos dát cez rôzne protokoly (HTTP, HTTPS, FTP a pod.).

Vlastné riešenia:

Vyvíjal vlastné knižnice a komponenty v prípadoch, keď štandardné riešenia nevyhovovali špecifickým požiadavkám projektu, ako napríklad:

  • Vysoký výkon a nízke latencie.
  • Potreba implementácie nestandardných protokolov.
  • Úzka integrácia s inými komponentmi systému.
  • Požiadavky na odolnosť voči chybám a škálovateľnosť, ktoré presahujú bežné scenáre použitia štandardných knižníc.

Príklad použitia vlastného riešenia pre asynchrónny TCP server:

// Príklad zjednodušeného asynchrónneho TCP servera na vlastnom riešení
#include <iostream>
#include <vector>
#include <asio.hpp> // Často používané ako základ pre pooly vlákien alebo asynchrónne operácie

class TcpServer {
public:
    TcpServer(asio::io_context& io_context, short port)
        : acceptor_(io_context, asio::ip::tcp::endpoint(asio::ip::tcp::v4(), port)) {
        start_accept();
    }

private:
    void start_accept() {
        // Čakanie na nové spojenie
        auto new_connection = std::make_shared<TcpConnection>(acceptor_.get_executor());
        acceptor_.async_accept(new_connection->socket(),
            [this, new_connection](const asio::error_code& error) {
            if (!error) {
                new_connection->start();
            }
            start_accept(); // Pokračujeme v prijímaní spojení
        });
    }

    asio::ip::tcp::acceptor acceptor_;
};

class TcpConnection : public std::enable_shared_from_this<TcpConnection> {
public:
    TcpConnection(asio::executor ex) : socket_(ex) {}

    asio::ip::tcp::socket& socket() { return socket_; }

    void start() {
        do_read();
    }

private:
    void do_read() {
        auto self(shared_from_this());
        socket_.async_read_some(asio::buffer(data_, max_length),
            [self](const asio::error_code& error, size_t bytes_transferred) {
            if (!error) {
                // Spracovanie prijatých dát
                self->do_write(bytes_transferred);
            }
        });
    }

    void do_write(size_t length) {
        auto self(shared_from_this());
        asio::async_write(socket_, asio::buffer(data_, length),
            [self](const asio::error_code& error, size_t /*bytes_transferred*/) {
            if (!error) {
                self->do_read();
            }
        });
    }

    asio::ip::tcp::socket socket_;
    enum { max_length = 1024 };
    char data_[max_length];
};

// int main() {
//     try {
//         asio::io_context io_context;
//         TcpServer server(io_context, 8080);
//         io_context.run();
//     } catch (std::exception& e) {
//         std::cerr << "Exception: " << e.what() << "\n";
//     }
//     return 0;
// }

Porovnávacia tabuľka prístupov:

Prístup Výhody Nevýhody Použitie
Štandardné knižnice Rýchly vývoj, overené, dobrá dokumentácia, podpora komunity. Obmedzená flexibilita, možný overhead. Väčšina bežných sieťových úloh.
Vlastné riešenia Plná kontrola, vysoká flexibilita, optimalizácia pre špecifické úlohy. Vysoké náklady na vývoj a údržbu, riziko chýb, potreba testovania. Špecifické požiadavky na výkon, nestandardné protokoly, úzka integrácia.

Celkový prístup závisel od konkrétneho projektu, jeho cieľov a obmedzení. Snažil som sa nájsť optimálnu rovnováhu medzi využitím hotových riešení a vývojom vlastných, kde to bolo odôvodnené.