# DirectPlay
DirectPlay, DirectX'in çok kullanıcı oyunlar başta olmak üzere birçok kişinin aynı anda birçok mesaj yolladığı ortamların yaratılmasını kolaylaştırmak için geliştirdiği bir iletişim protokolüdür. DirectPlay, sunucu-istemci (server-client) veya peer to peer tipi bir organizasyonda asenkron mesajlaşma, mesaj öncelikleri, paket birleştirme, kayıpsız gönderim veya paket şifreleme gibi olanaklar sunar ve DirectPlay Voice modülü sayesinde ses iletimini de mümkün kılar.


## Sunucu-istemci ve peer to peer arasında seçim.
Sunucu-istemci tipi bir ağda birçok istemci (kullanıcı) bir sunucuya bağlanır. Burada her kullanıcı sunucuya diğer kullancılara yollamak istediği mesajları bir kez verir, sunucu ise bu mesajı gerekli kullanıcılara yollamakla yükümlüdür. Dolayısıyla, sunucunun büyük miktarda ağ kaynağına sahip olması gerekmektedir.
Peer to peer tipi bir ağda ise, her kullanıcı her istediği kullanıcıya mesajını teker teker yollar. Her ne kadar bu kullanıcı başına düşen ağ yükünü artırsa da, sistemin paylaştırılmış olması ve dolayısıyla çökmesinin çok daha zorlaşmış olması bir avantaj kabul edilmektedir, üstelik bu oyun yazarını bir oyun sunucusu kurma derdinden de kurtarır.
Programcı, DCOM arayüzünü kullanarak IDirectPlayClient, IDirectPlayServer veya IDirectPlayPeer neslerinden kendi uygulamasına uygun olanları yaratır.


## Servis sağlayıcılar.
DirectPlay, mesajlaşma hizmetlerini muhtelif servis sağlayıcıları (service provider) kullanarak yapabilir. Genelde servis sağlayıcı TCP/IP olsa da bazı kullanıcıların ihtiyaçlarına göre Bluetooth veya modem de olabilir. Buna ek olarak, programcı isterse Microsoft'un sunduğu ayarlanabilir başarımlı TCP/IP servis sağlayıcısını kullanarak yazılımın değişik ağ koşullarında nasıl çalıştığını görebilir.


## Bağlantı.
Kontrol nesnesinin yaratılması, servis sağlayıcı ve ona bağlı adres nesnesinin de ona eklenmesiyle bağlantıya hazır hale gelinir. Bağlantı sırasında, DirectPlay nesnesi yaratırken belirttiğiniz mesaj alma fonksiyonuna çağrılarda bulunur ki bu çağrılardan en önemlileri:
  - DPN_MSGID_ENUM_HOSTS_RESPONSE mesajı bağlanma isteğinin kabul olduğuna işaret olarak gelir. Bağlantı bilgilerini içerir.
  - DPN_MSGID_CREATE_PLAYER ve DPN_MSGID_DESTROY_PLAYER mesajları oyuncular bağlandığında ve bağlantıyı koparttığında gelir.
  - DPN_MSGID_RECEIVE kullanıcıya mesaj gelince gelir (mesajlar SendTo metodu ile yollanır). Tartışmasız bir oyundaki en önemli mesaj da budur.
  - DPN_MSGID_TERMINATE_SESSION bağlantı kopunca gelir.
Unutulmaması gereken önemli noktalardan biri: DirectPlay, kullanıcı yaratılışı için kendi iç mesajlaşma sistemini kullanır. Dolayısıyla, yüksek öncelikli mesajlar yollandığında bu mesajlar o kullanıcıya "ilgili kullanıcı bağlandı" mesajından daha önce gelebilir.


## Ses bağlantısı.
"Normal" nesne bağlantısı kuruluduğunda, DirectPlayVoiceClient ve gerekiyorsa DirectPlayVoiceServer nesnelerini DCOM aracılığı ile yaratıp "normal" bağlantı nesnesine eklediğiniz anda ses bağlantısı kurulur. DirectPlay Voice, 1.2 kbit'den 64 kbit'e kadar değişik bant genişlikleri kullanan codecler ile birlikte gelir, ama maalesef dış codec kullanımı mümkün değildir. Sesin hangi kullanıcılara yollanacağı SetTransmitTargets metodu ile seçilir.
Son olarak, DirectPlayVoiceClient nesnesinin Create3DSoundBuffer metodu kullanılarak her oyuncuya özel bir üç boyutlu ses kanalı verilebilir!


## Sonuç.
Görüldüğü üzere, DirectPlay ile çok hızlı bir şekilde NAT ve UPnP desteğine sahip, gerekiyorsa şifreleme kullanabilen ve hatta üç boyutlu ses alış verişi yapabilen uygulamalar yapılması mümkündür.