Sobes.tech
Middle
171

Da li ste koristili standardne biblioteke ili ste razvili sopstena rešenja za rad sa mrežom?

Одговор од АИ

sobes.tech АИ

Користио сам како стандардне библиотеке, тако и сопствена решења, у зависности од пројекта и захтева.

Стандардне библиотеке:

  • Sockets API (BSD Sockets): Низко ниво API за рад са TCP/IP. Користи се за креирање сокета, успостављање веза, слање и пријем података.
  • Boost.Asio: Крос-платформска библиотека за асинхроно унос/излаз, често коришћена за мрежне операције због подршке за сокете, таймере и друге мрежне примитиве.
  • libcurl: Клијентска библиотека за пренос података преко различитих протокола (HTTP, HTTPS, FTP итд.).

Сопствена решења:

Развијао сам сопствене библиотеке и компоненте када стандардна решења нису задовољавала специфичне захтеве пројекта, као што су:

  • Висока перформанса и ниска латенција.
  • Потреба за имплементацијом нестандардних протокола.
  • Тесна интеграција са другим компонентама система.
  • Захтеви за отказоустойчивост и скалабилност који превазилазе типичне сценарије коришћења стандардних библиотека.

Пример коришћења сопственог решења за асинхрони TCP сервер:

// Поједностављени пример асинхроног TCP сервера са сопственим решењем
#include <iostream>
#include <vector>
#include <asio.hpp> // Често се користи као основа за пулове нити или асинхроне операције

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 << "Изузетак: " << e.what() << "\n";
//     }
//     return 0;
// }

Поређење приступа:

Приступ Предности Недостаци Примењиво
Стандардне библиотеке Брз развој, проверене, добра документација, подршка заједнице. Ограничена флексибилност, могућ overhead. Већина типичних мрежних задатака.
Сопствена решења Потпуна контрола, висока флексибилност, оптимизација за специфичне задатке. Високи трошкови развоја и одржавања, ризик од грешака, потреба за тестирањем. Специфични захтеви за перформансе, нестандардни протоколи, тешка интеграција.

Укупно, избор је зависио од конкретног пројекта, његових циљева и ограничења. Трагао сам за оптималним балансом између коришћења готових решења и развоја сопствених, где је то било оправдано.