(C++) SpaceSockets2 ile internete bağlanabilen uygulamalar yapalım! - Bölüm 2

Selamlar herkese!

Bu yazıda ilk bölümde yaptığımız mesajlaşma uygulamasını UDP ile yapacağız.

UDP protokolü; oyun, video konferans uygulamaları gibi, bağlantı sırasında 1-2 paket kopsa da hayati derecede önemi olmayacak uygulamalarda genelde kullanılır, çünkü UDP protokolü paketlerin gidip gitmediğini doğrulamaz. UDP hakkındaki yazımı okumanızı tavsiye ederim.

Başlamadan önce

İndirmediyseniz, SpaceSockets2 kütüphanesini GitHub üzerinden indirebilirsiniz. SpaceSockets2 GitHub linki.

Yazacağımız uygulamaların çalışma mantığı

Paketlerin gidip gitmediğini doğrulamayan, yani "datagram" protokollerde ağ tabanlı uygulamalar yapmak daha basittir. Sunucu ve istemci uygulamalarında da sadece soketi açarsınız ve mesaj gönderip alırsınız.

Kod kısmı

Hazırsak kod yazmaya başlayalım.

Öncelikle, SpaceSockets2 kullanan bir "iskelet UDP istemci programı" yazalım.

C++:
#include "SpaceSockets2.hpp" //SpaceSockets2 neredeyse, bu komutu oraya göre düzenleyin.

int main(){
   
    SpaceSockets2::udp udp_client("",WRITE_TO_FILE | WRITE_TO_TERMINAL);
    /*Burada, SpaceSockets2'nin UDP sınıfını kullanacağız. IP adresi alanını boş bırakmamız, bizlere
      bu programın "127.0.0.1" üzerinden, yani kendi bilgisayarımız üzerinden çalışacağını belirtir.
     
      WRITE_TO_FILE ve WRITE_TO_TERMINAL değerleri ise hata ayıklama bilgileri için flag'lardır. İsteğe
      bağlı olarak NO_DEBUG_INFORMATION flag'ı ile hata ayıklama bilgisi tutmayabilirsiniz.
    */
   
   
    return 0;
}

Daha sonra, bu iskelet programımıza başka özellikler ekleyelim. Tek başına iskelet uygulama bir işe yaramayacaktır.

C++:
#include "SpaceSockets2.hpp" //SpaceSockets2 neredeyse, bu komutu oraya göre düzenleyin.



int main(){

   

    SpaceSockets2::udp udp_client("",WRITE_TO_FILE | WRITE_TO_TERMINAL);

    /*Burada, SpaceSockets2'nin UDP sınıfını kullanacağız. IP adresi alanını boş bırakmamız, bizlere

      bu programın "127.0.0.1" üzerinden, yani kendi bilgisayarımız üzerinden çalışacağını belirtir.

     

      WRITE_TO_FILE ve WRITE_TO_TERMINAL değerleri ise hata ayıklama bilgileri için flag'lardır. İsteğe

      bağlı olarak NO_DEBUG_INFORMATION flag'ı ile hata ayıklama bilgisi tutmayabilirsiniz.

    */
   
    char message_buffer[1000]; //1000 karaktere kadar olan mesajlar, bu tamponda saklanacaktır.
   
    while(1){ //Sonsuz döngü.
       
        if(!udp_client.receive_udp_package(message_buffer)){ //Buffer'ın içine mesajlarımızı alacağız. Eğer bu fonksiyon 0 (sıfır) döndürürse işlemin başarılı olduğu anlamına gelmekte.
           
            std::cout<<"Server diyor ki : "<<message_buffer<<std::endl; //Eğer paket geldi ise mesajı göster.
           
           
        }
       
    }
   

    return 0;

}

Şimdi de bir sunucu uygulaması yapalım.

Yukarıdaki iskelet uygulamamız sunucu için de geçerli olduğundan dolayı bir adet daha iskelet uygulama koymayacağım.


C++:
#include "SpaceSockets2.hpp"


int main(){

    SpaceSockets2::udp udp_server("127.0.0.1",WRITE_TO_FILE | WRITE_TO_TERMINAL); //localhost üzerinde oluşturmuş bulunmaktayım.
    char msg[1000] = "Hello from SpaceSockets2!\n"; //Gönderilecek mesaj.
   

    while(1){ //Sonsuz döngü.

    if(!udp_server.send_udp_message(msg)){ //UDP mesajı başarıyla gönderildiyse 0 (sıfır) döndürecektir.

        std::cout<<"Mesaj gonderildi!"<<std::endl; //UDP mesajı gönderildiyse "mesaj gönderildi" yazsın.


    }

    }





    return 0;
}

İki programı da derleyip çalıştırdığımızda ise, şöyle bir çıktı almaktayız:

spacesockets-udp-chat.png


Görüldüğü üzere, uygulamalarımız UDP ile haberleşiyor. Bir de Wireshark üzerinden izleyelim bakalım.

spacesockets2-wireshark.png


Evet, iki uygulamamız da birbirine UDP mesajları yolluyor. Port belirtmediğimiz için de 8080 portu üzerinden yolluyor.

Bir dahaki yazıda görüşmek üzere, takipte kalın!

Yorumlar

Socket.io tarzı kullanabileceğimiz, http sayfa kurabileceğimiz bir kütüphane var mı acaba ?
İki bilgisayar arasında (biri sanal makine, gerçek donanımda da deneyebilirim), lokal ağda denedim ve çalıştı. Eğer portunuz da açıksa SpaceSockets2 ile de yayın yapabilecek bir uygulama geliştirebilirsiniz.

spacesockets2-webserver.png



Onun dışında ASIO ile de yapabiliyor olmanız gerek.
 
Normal WS ile bir farkını göremedim iki kütüphaneninde.
Amacım sitedeki VueJS üzerinden farklı farklı birden çok data içeren mesajlar atıp geri dönüt almak ve timerlar kullanmak. Socket.io buna imkan sağlayan bir yapıya sahip.

socket.emit("msg", data) , socket.on("msg2", data)
 
Normal WS ile bir farkını göremedim iki kütüphaneninde.
Amacım sitedeki VueJS üzerinden farklı farklı birden çok data içeren mesajlar atıp geri dönüt almak ve timerlar kullanmak. Socket.io buna imkan sağlayan bir yapıya sahip.

socket.emit("msg", data) , socket.on("msg2", data)
Bir nevi indirme yapmak istiyorsunuz anladığım kadarıyla. SpaceSockets2 bunu da destekliyor. Bunun için örnek bir uygulama yazacağım bir dahaki yazımda.
 
İndirme değil, msg almak istemediğim datayı belirtiyor, karşı taraf da ona göre gönderim yapıyor. WebSocket ise istek ne olursa olsun bütün datayı yolluyor.
 
İndirme değil, msg almak istemediğim datayı belirtiyor, karşı taraf da ona göre gönderim yapıyor. WebSocket ise istek ne olursa olsun bütün datayı yolluyor.
Hmm, sanırım anladım. HTTP mesajları da gelen veri ile olduğundan dolayı verinin içeriğini bozabiliyor çoğunlukla. Evet, o olay ile ilgilenmeyi düşünüyorum.
 

Blog girdisi detayları

Ekleyen
TerabyteForever
Okuma süresi
2 dakika okuma
Görüntüleme
778
Yorumlar
6
Son güncelleme

Yazılım kategorisindeki diğer girdiler

  • Basit Modüller
    # Geçen ders fonksiyonları işlemiştik. Fonksiyonlar sayesinde karmaşık kodlara tek komutla...
  • Fonsiyonlar
    # Şu ana kadar pek çok ilginç şey öğrendik. Bunlara çeşitli komutlar da dahildi. Fakat bu...
  • String Veri Tipi
    # Daha önce de üzerinde konuştuğumuz str veri tipi, pek çok ilginç özelliğe sahiptir. Mesela str...
  • Döngüler
    # Döngü, programın tamamını veya programın bir bölümü belli bir koşula göre tekrarlı şekilde...
  • Karşılaştırma ve Koşul İfadeleri 2: Mantık Bağlaçları
    # Python'da mantık bağlaçları bulunur. Bunlar karşılaştırma ve koşul ifadeleriyle sıkça beraber...

TerabyteForever adlı kullanıcının diğer girdileri

Bu girdiyi paylaş

Geri
Yukarı