Sobes.tech
Middle

Vai izmantojāt standarta bibliotēkas vai izstrādājāt savus risinājumus tīkla darbam?

sobes.tech AI

Atbilde no AI

Es izmantoju gan standartās bibliotēkas, gan arī savus risinājumus atkarībā no projekta un prasībām.

Standartās bibliotēkas:

  • Sockets API (BSD Sockets): Zemā līmeņa API darbam ar TCP/IP. To izmanto, lai izveidotu soketus, iestatītu savienojumus, sūtītu un saņemtu datus.
  • Boost.Asio: Krosplatforma bibliotēka asinhronai ievadei/izdarei, bieži izmanto tīkla operācijām, pateicoties soketu, taimeru un citu tīkla primitīvu atbalstam.
  • libcurl: Klienta bibliotēka datu pārraidīšanai pa dažādiem protokoliem (HTTP, HTTPS, FTP utt.).

Savi risinājumi:

Izstrādāju savas bibliotēkas un komponentes tad, kad standarta risinājumi neatbilda projekta specifiskajām prasībām, piemēram:

  • Augsta veiktspēja un zemas aizkaves.
  • Nepieciešamība īstenot nestandarta protokolus.
  • Tiesnējas integrācija ar citiem sistēmas komponentiem.
  • Prasības pret kļūdu izturību un mērogojamību, kas pārsniedz standarta bibliotēku tipiskos scenārijus.

Piemērs, kā izmantot savu risinājumu asinhronam TCP serverim:

// Vienkāršots asinhrona TCP servera piemērs ar savu risinājumu
#include <iostream>
#include <vector>
#include <asio.hpp> // Bieži izmanto kā pamatu straumju vai asinhrono operāciju pulēm

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() {
        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();
        });
    }

    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) {
                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;
// }

Salīdzinājuma tabula pieejām:

Pieeja Priekšrocības Trūkumi Piemērošana
Standarta bibliotēkas Ātra izstrāde, pārbaudīta, laba dokumentācija, kopienas atbalsts. Ierobežota elastība, iespējams lieks slogs. Lielākā daļa tipisku tīkla uzdevumu.
Savi risinājumi Pilnīga kontrole, augsta elastība, optimizācija konkrētiem uzdevumiem. Augstas izstrādes un uzturēšanas izmaksas, kļūdu risks, nepieciešama testēšana. Īpašas prasības, nestandarta protokoli, cieša integrācija.

Kopumā, pieeja tika izvēlēta atkarībā no konkrētā projekta, tā mērķiem un ierobežojumiem. Mēģināju atrast optimālo līdzsvaru starp gataviem risinājumiem un saviem, kur tas bija pamatoti.