Haftalık C++ 54 – Boost.Asio I – Giriş

Merhaba sevgili yazılımperver dostlarım, bu yazımda STL’den sonra en çok kullanılan C++ kütüphanelerinden olan boost’un, önemli bileşenlerinden olan Boost.Asio’ya bir giriş yapıyor olacağız. Daha önceki yazılarımda da ifade ettiğim üzere, C++ kabiliyetlerinin bir çoğunun üzerinde geçmiş olduk, artık biraz daha C++ kullanımına yönelik yazılara da ağırlık vereceğimden bahsetmiştim. Elbette bir takım C++ kabiliyetlerine henüz değinmedim, özellikle C++ 20 ile gelenlere, onlara da bakıyor olacağız, fakat bu tarz yazıların da sayısını arttırmayı planlıyorum.

Boost.Asio özellikle ağ ve alt seviye G/Ç programlama için hazır bir takım kabiliyetler sunan bir C++ kütüphanesidir. İleride paylaşacağım yazılarda da göreceğiniz üzere, bunu da yaparken hem asenkron hem de senkron çalışma modeline uygun API’ler sunmaktadır. Aslına bakarsanız, ASIO ismi de “asynchronous input/output”‘tan gelmektedir. Asenkron model, temelde bir operasyonun bitimini beklemeye ihtiyacınız olmadan, diğer işlevler devam edebilmeye dayanan modeldir. Bir diğer ifade ile, örneğin bir dosya okuyacaksınız, senkron bir model takip ettiğiniz durumda, dosyaOkuma() yı çağırdığınızda, mevcut ilerleyiş dosya okuma bitene kadar duracaktır (blocking) ve bu işlemin tamamlanması beklenecektir. Asenkron bir modelde ise, benzer bir çağrı yaptığınızda, ilgili çağrı hemen dönecek fakat asıl vakit alacak kısım (dosya okuma) arka planda farklı bir thread (ya da benzer bir mekanizma) tarafından gerçekleştirilerek ve mevcut akış işlem tamamlandığında (ya da tamamlanamadığında) haberdar edilir. Aslında bakarsanız daha önce gördüğümüz std::async() buna örnek olarak verilebilir. Elbette, bunu söylediğimde her zaman asenkron yaklaşım takip edilecek nihai yöntem gibi görülse de, karmaşıklığı arttırabilir. Boost.asio da bunu azaltmayı hedeflemekte.

Aşağıdaki figürün bu konuda sizlere bir fikir vereceğini umut ediyorum.

sync

Daha önce de bir kaç yazımda ağ programlama ile ilgili örneklere bakmıştık. Bunu da yaparken genel olarak QT ve QML kullanmıştık. Şimdi aynı kabiliyetleri, boost.asio kullanarak yapıyor olacağız. Bu yazılarıma göz atmak isteyen takipçilerimi aşağıdaki bağlantılara bakabilirler.

Peki neden boost.asio? Boost.asio, ağ programlama gibi işletim sistemine bağımlı alt seviye kabiliyetlerden, sizleri soyutlayarak taşınabilir uygulamalar geliştirmenize yardımcı olur. Ayrıca, benzer ağ programlama alternatiflerine göre en olgun olanlardan birisidir. İleride de göreceğimiz üzere, boost.asio sadece ağ programlama değil diğer asenkron işlevler için de kullanım sunmaktadır.

Kendi dokümanyasyonuna baktığımızda, boost.asio aşağıdaki hedefleri sağlamayı amaçlamış:

  • Taşınabilir olmak (“Portability”),
  • Genişleyebilirlik (“Scalability”),
  • Verimlilik (“Efficiency”),
  • BSD Soketler gibi halihazırda mevcut yapılar ile uyumluluk,
  • Kolay kullanım (“Ease of Use”),
  • Genişleyebilmeye Olanak Sağlama (“Basis for further abstraction”)

Peki özetle boost.asio bize ne sunuyor?

  • Mevcut bir çok işletim sistemi için kullanılabilecek, ağ programlama ve benzeri kabiliyetleri geliştirme,
  • IPv4 ve IPv6 desteği,
  • TCP ve UDP desteği,
  • Asenkron operasyon desteği,
  • std::iostream uyumlu arayüzler,
  • SSL desteği,
  • Sayaçlar.

Boost.asio’ya ilişkin genel bir bilgi edindikten sonra şimdi bu kütüphaneyi nasıl oluşturabileceğimize bir göz atalım. Bir sonraki yazımda da hemen örnek bir kullanıma bakıyor olacağız.

Boost.Asio’nun bağımlılıkları aşağıdaki gibidir:

  • Boost.System,
  • Boost.Coroutine (opsiyonel),
  • Boost.Regex (opsiyonel),
  • OpenSSL (opsiyonel).

İlk olarak Linux ve WSL için nasıl kurulum yapabileceğimize bir göz atalım.

  • Boost’u kurmadan önce, b2’yi oluşturalım.
    • Aşağıdaki değişkeni (DST_DIR) tanımlayalım ve sonra da bootstap komutunu çalıştıralım,

  • Şimdi boostu’u oluşturalım. Eğer sadece asio ve ilgili kütüphaneleri oluşturmak için aşağıdaki komutu kullanabilirsiniz:

  • Bütün Boost kütüphanesini oluşturmak için ise aşağıdaki komutları kullanabilirsiniz:

  • Yukarıdaki komutlar sonrasında, Boost kütüphanelerine ilişkin;
    • Başlık dosyaları /home/yazilimperver/repos/boost_1_81_0/boost dizininde durur (başlık dosyası dizini olarak /home/yazilimperver/repos/boost_1_81_0 verebilirsiniz),
    • Kütüphane dosyaları ise /home/yazilimperver/repos/boost_1_81_0/stage/lib dizininde durur.
  • Kütüphanenin başarılı bir şekilde oluşturulup/oluşturulmadığını denemek için:
    • touch example.cpp deyip ilgili dosyayı oluşturalım ve içeriğini aşağıdaki gibi dolduralım,
    • Örnek uygulamayı derlemek için aşağıdaki komutu çağıralım:

    • Boost kütüphanelerini bağlamak için ise -L deyip kütüphane dizinini verip, -lKütüphaneİsmi ile de ilgili kütüphaneleri verebilirsiniz,
    • echo 1 2 3 | ./example ile de deneyelim. Çıktı olarak 1, 2 ve 3’ün 3 katının komut satırına basıldığını görebilirsiniz.

Şimdi de, Windows/Visual Studio kullanacak takipçilerim için gerekli adımlara göz atalım:

  • Boost kaynak kodlarını https://boostorg.jfrog.io/artifactory/main/release/1.81.0/source/boost_1_81_0.7z sayfasından indirelim,
  • Mevcut VS “Developer Command Prompt” açalım ve boost kütüphanesinin kaynak kodlarının olduğu dizine gidelim,
  • bootstrap.bat betiğini çalıştıralım,
  • Şimdi kütüphaneyi oluşturalım. Ben burada, 64Bit için ve Visual Studio 2023 olarak bu kütüphaneyi oluşturacağım. Bunun için de aşağıdaki komutu kullanabilirsiniz:
    • b2 –build-dir=build\x64 address-model=64 threading=multi –stagedir=.\bin\x64 –toolset=msvc -j 8 link=static,shared runtime-link=static,shared –variant=debug,release
  • Bu adımdan sonra bir kahve içebilirsiniz, çünkü biraz vakit alıyor olacak 🙂

Kütüphane oluşturma ve ayarlarına ilişkin daha detaylı bilgiler için aşağıdaki bağlantılara da göz atabilirsiniz:

Evet sevgili yazılımperver dostlarım, bu yazımda boost kütüphanelerini oluşturarak, sonraki maceralarımıza ilk adımımızı atmış olduk. Bir sonraki yazımda, asio ile ilgili temel kavramlar ve örnek kullanımlara başlıyor olacağız, o zaman kadar bol kodlu günler.

2 Comments Haftalık C++ 54 – Boost.Asio I – Giriş

  1. hande

    çok güzel bir içerik. güncel olarak boost asioya alternatif neler önerirsiniz? ve şuan boost asio tercih edilir mi?

    güncel içeriklerinizin devamını dilerim.

    Reply
    1. yazılımperver

      Aslına bakarsanız QT bu anlamdan en öne çıkan framework, özellikle kullanıcı arayüzü de C++ ile geliştirmek istiyorsanız (qml de oldukça güçlü), iyi bir alternatif olabilir. Ben de bir çok projem için Qt’yi kullanıyorum. Fırsat bulursam inşallah ben de basit bir alternatif kütüphane paylaşıyor olacağım.

      Bu arada, Boost Asio’nun, boost bağımlılıkları olmayan bir hali de mevcut, Asio C++ Library, boost C++ standardına çok fazla girdi sağlaması sebebi ile asio konusunda bilgi sahibi olmanızın faydalı olacağını düşünüyorum.

      Reply

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.