Reliable UDP Mantığı Nedir?
-
Şuanki socket sistemim güzel bir şekilde çalışıyor. UDP kullandığım için yapısı gereği bazen clientten servera veya serverdan cliente mesaj iletilmiyor.
Bu iletilmeyen mesajları tekrar göndertmek istiyorum.
En basit haliyle server tarafında şöyle bir şey denedim ama pek sağlıklı olmadı.
Serverda bir array ve fonksiyon oluşturdum. Bu fonksiyon sürekli olarak array içerisinde şöyle bir denetleme yapıyor
şuanki tarih - gönderilen mesaj tarihi büyükse 1 saniyeden mesajı tekrar gönder1.Server mesajı gönderir
2.Server gönderdiği mesajı arrayde tutar
3.Clientten "mesajı aldım" bilgisi 1 saniye içerisinde gelmezse server mesajı tekrar gönderir.
4.Client mesajı alır
5.Client "mesajı aldım" bilgisini gönderir
6.Servera "mesajı aldım" bilgisi gelirse arrayden o item silinir.Sağlıklı olmamasının sebebi bazen 5.adımdaki "mesajı aldım" bilgisi servera iletilemiyor.
Bu sistemi client tarafınıda eklersem sürekli olarak veri gitti mi, mesajı aldım gitti mi diye döngüye gireceğini düşündüğüm için yolun başındayken fikirlerinizi alıp ona göre ilerlemek istiyorum.TCP kullan demeyin UDP'ye girdim bir kere artık dönüşüm yok
-
TCP bunun için :)
Uzun zamandır uğraşmadığım için öneri niteliğinde yazıyorum.
Her mesaj içinde mesaja ait bir tanımlama numarası oluşturup, bunu bir arttırırsan paketleri sıralı yollama zorunluluğundan kurtulabilirsin. Böylece atıyorum 11 nolu paket gitmedi ise 12, 13, 14... nolu paketi gönderebilir, sistemi 11 nolu paket gitsin diye bloke etmezsin.
Maalesef, o paket önemli ve karşıya ulaştığı bilgisi lazımsa sonsuz döngüden başka yapacak bir şey yok. Paket kayıpları artarsa o zaman neden bu kadar paket kayboluyor diye araştırma yapabilirsin.
İşte bu nedenlerden dolayı TCP kullanmak lazım:) Özel bir uygulama olsaydı, örneğin birden fazla mobil modem ile veri yollama gibi, o zaman UDP çözüm daha mantıklı olabilirdi.
Şu rfc'yi okumalısın: http://www.belgeler.org/rfc/rfc768.html
Meraklılar için: http://www.belgeler.org/bgnet/bgnet_theory-twotypes.html
-
YeniHarman bunu yazdı
TCP bunun için :)
Uzun zamandır uğraşmadığım için öneri niteliğinde yazıyorum.
Her mesaj içinde mesaja ait bir tanımlama numarası oluşturup, bunu bir arttırırsan paketleri sıralı yollama zorunluluğundan kurtulabilirsin. Böylece atıyorum 11 nolu paket gitmedi ise 12, 13, 14... nolu paketi gönderebilir, sistemi 11 nolu paket gitsin diye bloke etmezsin.
Maalesef, o paket önemli ve karşıya ulaştığı bilgisi lazımsa sonsuz döngüden başka yapacak bir şey yok. Paket kayıpları artarsa o zaman neden bu kadar paket kayboluyor diye araştırma yapabilirsin.
İşte bu nedenlerden dolayı TCP kullanmak lazım:) Özel bir uygulama olsaydı, örneğin birden fazla mobil modem ile veri yollama gibi, o zaman UDP çözüm daha mantıklı olabilirdi.
Şu rfc'yi okumalısın: http://www.belgeler.org/rfc/rfc768.html
Meraklılar için: http://www.belgeler.org/bgnet/bgnet_theory-twotypes.html
Ilk basta TCP kullaniyordum sonrasinda UDPye gecis yaptim. UDPye gecme sebebimde online ve herkesin ayni anda oynadigi(turn based yani sira ile oynanan oyun degil ornegin satranc gibi) oyun oldugu icindi.
Suan projede udp socket kullaniyorum. Tcpye gore gozle gorulur hiz farki var. Oynanis esnasinda saniyede 60-70 kez veri gonderiliyor. Bu kadar veriden 3-5i kaybolsun onemli degilde kullanici menudeyken Mac Ara veya Arkadaslik Istegi Gonder gibi verilerin(butona tiklaninca bir kere calisan fonksiyonlarin) iletilmemesi buyuk sıkıntı yaratiyor.
Sabaha kadar bir cozum bulamazsam mecbur sonsuz dongude kontrol yaptiracagim.
Onerin icin sagol. Linktekileride sabaha detaylica okurum.
-
Hocam bence senin mimari yanlış.
Udp socketi canlı yayın gibi çok önemi olmayan datalar için kullanman gerekiyor. Adam videoda 3-5 frame eksik almadı adama çok koymaz fark dahi etmez. Ama sen oyundan bahsediyorsun. Kesinlikle tcp olmalıydı. Evet udp daha hızlı ama senin verinde önemli. Trade off yapman lazım. Hızdan ödün vereyim diye projeyi perte çıkarma :)
CS go, lol, pub g gibi oyunlar tamamen tcp.
Sen audio, video streaming yapmıyorsun udp kullanma. Yada 2 socket çalıştır. Önemsiz dataları udp ile gönder önemli olanları tcp
MhmdAlmz tarafından 04/Oca/20 07:19 tarihinde düzenlenmiştir -
Tekerleği baştan icat etmeye lüzum yok hocam. Neden mosquitto tarzı bir broker kullanmıyorsun
-
Pro degilim ancak,
Oyun sırasında udp, menü VS gibi Server komut gönderilmesi gereken ilerde tcp kullansan iş çözülür
-
WebSocket kullanmalısın hocam.
WebSockets, on the other hand, allow for sending message-based data, similar to UDP, but with the reliability of TCP.
-
Yorumlarınız için teşekkürler. Çoklu alıntıyı çözemediğim için buradan yazayım :)
LoL tarzı oyunlar nasıl çalışıyor diye önceden bakmıştım. Menude TCP, oyunda UDP kullanıyorlar diye biliyorum. Belki benimde bu şekilde TCP ve UDP bağlantısı kullanmam gerekirdi. Network konusunu çok fazla araştırmadan bir acemilik yapıp projeye giriştim.
Şuan projenin sonuna geldim ve yeni bir şey eklemek için 1-2 günüm dahi yok. Bu yüzden geçici olarak ilk mesajda yazdığım sistemi ekleyip projeyi teslim ettikten sonra muhtemelen menu kısmını TCP ile yaparım.