Sobes.tech
Middle
172

Ağ ile çalışmak için standart kütüphaneleri mi kullandınız yoksa kendi çözümlerinizi mi geliştirdiniz?

AI'dan gelen yanıt

sobes.tech yapay zeka

Proje ve gereksinimlere bağlı olarak hem standart kütüphaneleri hem de kendi çözümlerimi kullandım.

Standart kütüphaneler:

  • Sockets API (BSD Sockets): TCP/IP ile çalışma için düşük seviyeli API. Soket oluşturma, bağlantı kurma, veri gönderme ve alma işlemlerinde kullanılır.
  • Boost.Asio: Çok platformlu asenkron giriş/çıkış kütüphanesi, genellikle soketler, zamanlayıcılar ve diğer ağ primitifi desteği sayesinde ağ çalışmaları için kullanılır.
  • libcurl: Çeşitli protokoller (HTTP, HTTPS, FTP vb.) üzerinden veri iletimi için istemci kütüphanesi.

Kendi çözümler:

Standart çözümler projedeki özel gereksinimleri karşılamadığında, aşağıdaki durumlar için kendi kütüphanelerimi ve bileşenlerimi geliştirdim:

  • Yüksek performans ve düşük gecikme.
  • Standart olmayan protokollerin uygulanması ihtiyacı.
  • Sistem bileşenleriyle sıkı entegrasyon.
  • Standart kütüphanelerin tipik kullanım senaryolarını aşan hata toleransı ve ölçeklenebilirlik gereksinimleri.

Kendi çözümümün kullanımıyla ilgili örnek, asenkron TCP sunucusu:

// Kendi çözümümüzle basitleştirilmiş asenkron TCP sunucusu örneği
#include <iostream>
#include <vector>
#include <asio.hpp> // Sık sık iş parçacığı havuzları veya asenkron işlemler için temel olarak kullanılır

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() {
        // Yeni bağlantı bekleniyor
        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(); // Bağlantı kabul etmeye devam et
        });
    }

    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) {
                // Alınan verilerin işlenmesi
                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;
// }

Yaklaşımların karşılaştırması:

Yaklaşım Avantajlar Dezavantajlar Uygulama
Standart kütüphaneler Hızlı geliştirme, kanıtlanmış, iyi dokümantasyon, topluluk desteği. Esneklik sınırlı, olası overhead. Çoğu tipik ağ görevi.
Kendi çözümlerim Tam kontrol, yüksek esneklik, belirli görevlere optimize. Yüksek geliştirme ve bakım maliyeti, hata riski, test gereksinimi. Performans gereksinimleri, standart olmayan protokoller, sıkı entegrasyon.

Genel olarak, seçim proje, hedefler ve kısıtlamalara bağlıydı. Mevcut çözümler ile kendi çözümlerimi kullanma arasında optimal dengeyi bulmaya çalışıyordum.