Sobes.tech
Middle

Kas kasutas standardraamatukogusid või arendas oma lahendusi võrguga töötamiseks?

sobes.tech AI

Vastus AI-lt

Kasutas nii standardraamatukogusid kui ka oma lahendusi, sõltuvalt projektist ja nõuetest:

Standardraamatukogud:

  • Sockets API (BSD Sockets): Madala taseme API TCP/IP-ga töötamiseks. Kasutatakse sokkide loomisel, ühenduste seadistamisel, andmete saatmisel ja vastuvõtmisel.
  • Boost.Asio: Ristplatvormiline asünkroonne sisendi/väljundi raamatukogu, mida sageli kasutatakse võrgutööde jaoks sokkide, taimerite ja teiste võrguprimitivide toetamise tõttu.
  • libcurl: Kliendi raamatukogu andmete edastamiseks erinevate protokollide kaudu (HTTP, HTTPS, FTP jne).

Oma lahendused:

Arendasin oma raamatukogusid ja komponente siis, kui standardlahendused ei vastanud projekti spetsiifilistele nõuetele, näiteks:

  • Kõrge jõudlus ja madal latentsus.
  • Vajadus rakendada mitte-standardsed protokollid.
  • Tihe integratsioon teiste süsteemi komponentidega.
  • Vastupidavus ja skaleeritavusnõuded, mis ületavad standardraamatukogude tavapäraseid kasutusstsenaariume.

Näide, kuidas kasutada oma lahendust asünkroonse TCP serveri jaoks:

// Lihtsustatud näide asünkroonse TCP serveri oma lahendusega
#include <iostream>
#include <vector>
#include <asio.hpp> // Sageli kasutatakse voogude või asünkroonsete operatsioonide poodide aluseks

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

Vērtēšanas tabula pieejām:

Pieeja Priekšrocības Trūkumi Piemērošana
Standartbibliotē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. Specifiski 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.