Gönderen Konu: Winsock yardım  (Okunma sayısı 18211 defa)

Winsock yardım

« : 12.10.2009 14:58:15 »
Hızlı düğmeleri aç

paradox

İleti: 134

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
bir adet server ve bitanede client'im var...
serverdan client'e birkaç veri arka arkaya gönderdiğimde herşey normal oluyor..
Fakat client'den servera arka arkaya veri gönderdiğimde veriler karişiyor..

mesela:

client:
Gönder(x);
Gönder(y);
Px=GelenData();
Py=GelenData();

server:
Gönder(a);
Gönder(b);
Ax=GelenData();
Ay=GelenData();


burada float x,y,a,b değerlerini gönderiyorum..
serverdan gönderdiğim a,b sayıları client'de px,py oluyor..bunda bi problem yok..
Fakat client'den gönderdiğim x,y sayıları Ax,Ay sayıları karışıyor..
Ax=x (clientten gelen x) olucakken Ax=y oluyor arada sonra gene Ax=x oluyor..

Winsock yardım

« Yanıtla #1 : 12.10.2009 15:25:50 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
biraz daha detay lazım. mesela TCP mi UDP mi kullanıyorsun? UDP'de paketlerin ulaşma sıralamalarında garanti yoktur. Yani sen önce A, sonra B göndersen de önce B sonra A ulaşabilir. TCP'de ise sıra korunur. UDP kullandığını varsayıyorum ve pakete birkaç bytelık bir header eklemeni ya da iki datayı tek bir pakette göndermeni öneriyorum.

Winsock yardım

« Yanıtla #2 : 12.10.2009 16:08:18 »
Hızlı düğmeleri aç

paradox

İleti: 134

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
udp kullanıyorum.
Peki bu iki yada daha çok datayı tek pakette nasıl gönderebilirim.

Winsock yardım

« Yanıtla #3 : 12.10.2009 16:41:38 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
paketi tamamen binary olarak düşüneceksin. sonuçta paketin içeriği bytelardan ibaret. her dilde yöntem değişir ancak float dediğin 4 byte birşey. peş peşe 2 float toplam 8 bytelık bir paket oluşturur. öteki tarafta byte byte okunan paketin ilk 4 byte'ı birinci değişkene, son 4 byte'ı ikinci değişkene alınabilir.
 
UYARI! UDP güvenilir bir protokol değildir, paket kaybı olabilir (hatta olur). Dolayısıyla TCP kullanmanı tavsiye ediyorum. UDP çok fazla adette gönderilen ve kayıp verinin aşırı problem olmayacağı veriler için idealdir. Örneğin audio, video streaming, MMO tarzı oyunlardaki bazı server/client iletişimi v.s. Yani eğer amacın aşırı yüklü bir işlem değilse UDP'yi tavsiye etmem, TCP garantilidir. Paket ulaşmazsa hata mesajı alabilir, gerekirse yeniden gönderebilirsin. UDP'de ise gönderdiğin paketi yanlış bir IP'ye bile göndersen, senden çıktıktan sonra bir kontrolün yoktur paket üzerinde. IP doğru bile olsa o anda bilgisayar/cihaz erişilmez durumdaysa bunu göremezsin. Tek yol kendi acknowledge mekanizmanı kurmandır ki basit birşey için gereksiz. TCP protokolü zaten sana bunu sağlıyor, checksum'ını ekliyor pakete, ulaştığını doğruluyor v.s.

Winsock yardım

« Yanıtla #4 : 12.10.2009 19:01:45 »
Hızlı düğmeleri aç

paradox

İleti: 134

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
teşekkürler

Winsock yardım

« Yanıtla #5 : 20.01.2010 23:34:46 »
Hızlı düğmeleri aç

paradox

İleti: 134

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
arkadaşlar ilk mesajımdaki olayı tcp ile hallettim..Lan olarak hızlı bi şekilde çalışıyor..Ama online denediğimde kasıyor..
ıkitane küp yaptım..bitanesi serverin biri clientin..birbirine hareket pozisyonlarını gönderiyorum kendim deniyorum serveri ve clienti açıp hiç bi sorun yok..online denediğmizde hem kendi kübüm hemde clientin kübü frame frame hareket ediyor..Neden böyle ola ki acaba:D

Winsock yardım

« Yanıtla #6 : 21.01.2010 02:32:18 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
çünkü pozisyonu değil hareketi göndermen lazım. yani her koordinat değişiminde bir paket göndermek yerine tuşa basıldığında ve tuştan elini çektiğin anda yalnızca 2 paket göndererek gerisini client'a bırakman lazım. ancak bu defa da işin içine laglerden kaynaklanan sorunlar giriyor. ben şöyle yapıyorum, 2. pakette yani tuştan elini çektiğinde bir de coordinate correction bilgisi yolluyorum servera. Server tuştan el çekildiği anı biraz geç de alsa koordinatı düzeltebiliyor. Diğer clientlarda bu ufak bir geri atlama şeklinde görüntülenebiliyor. Bunu çözmek için de birkaç yol var.
 
1) ortalma lag miktarı bulunup tüm eventler lag miktarı kadar geriden takip edilebilir.
2) tuşlarla hareket yerine "point to click" yöntemi kullanılabilir. yani WASD gibi bir hareket yerine mouse ile clicklenen koordinata doğru hareket eder sprite.
 
Edit: WASD kullanmak istiyorsan işte bu durumda UDP daha makul bir çözüm olabilir. Genellikle nesneler sürekli hareket halinde olacakları için aradan 1-2 paket kaçması sorun olmaz. Dediğim gibi zaten koordinatlar hareket sona erdiği anda güncelleniyor. Bu da aklında bulunsun. Modern MMOlar TCP+UDP kullanıyor genelde. Inventory, alış veriş sistemi, görev sistemi v.s. kritik şeyler TCP ya da acknowledgelı UDP ile yapılırken sprite hareketleri plain UDP ile yapılıyor.
« Son Düzenleme: 21.01.2010 02:36:33 Gönderen: skate »

Winsock yardım

« Yanıtla #7 : 21.01.2010 09:03:32 »
Hızlı düğmeleri aç

Hydrogen

İleti: 932

Çevrimdışı
  • 7DX Organizer
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.glance.ws
Iyi mmorpg'ler genelde karakter hareketleri icin dahi udp kullanmiyorlar. Zira, bir adamin herhangi bir yone gittigi bilgisi dahi, genelde tek paketle cozuluyor(skate'in dedigi bas-cek olayi), karakterler hizlanirken ivmelenme vs. cok fazla kullanilmiyor. Tek paketin dahi kaybi, isinlanma problemlerine bolca neden olur, ki UDP'de onemli yuzdelerde paketler kayboluyor. Zaten iyi dizayn edilmis oyunlarda buna cok da gerek de olmuyor. WoW mesela, oyunla ilgili her sey tcp. Udp'yi sadece voice chat icin kullaniyor. I can football gibi, hizin inanilmaz onemli oldugu bir oyunda dahi tcp yeterli.
 
Internet uzerinden kup cevirmeye neden ihtiyac duydugunu da anlayamadim. Bu sunucular genelde cok optimize yaziliyorlar. Milyonlarca bilgi gitmiyor paketlerde. Bir fizik olayi hala mmorpg'nin icine gomulebilecek durumda degil mesela. Sonucta udp de olsa, tcp de olsa aralarda birbirlerine kilometrelerce kablo ile baglanmis binlerce user var.

Winsock yardım

« Yanıtla #8 : 21.01.2010 18:48:56 »
Hızlı düğmeleri aç

paradox

İleti: 134

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
hareket olayı için skate dediğini anladım..Ama belli bir durumu kontrol etmek için nası olucak.Yani oyuncuda 4 tane skil var diyelim..bunları kullanırken sürekli servera bilgi göndermesi lazım.Yada oyundaki yaratıkların Canları sürekli servera yollanıcak serverda kullanıcılara göndericek..

"Internet uzerinden kup cevirmeye neden ihtiyac duydugunu da anlayamadim"
Yani ben evde online oyun motoru yazamammı demek istedin.

Winsock yardım

« Yanıtla #9 : 21.01.2010 20:20:00 »
Hızlı düğmeleri aç

Hydrogen

İleti: 932

Çevrimdışı
  • 7DX Organizer
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.glance.ws
Burasi demoscene forumu oldugundan, kup deyince aklima rotate eden kup geldi, boyle realtime net uzerinden donuyor, sen kupten dummy olarak bahsettin herhalde:)
 
Yani evde online oyun motoru yazamazsin demedim. Sadece kup cevirmeyle baglantisini kuramamistim.

Winsock yardım

« Yanıtla #10 : 21.01.2010 20:44:37 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
Yanlış anlaşılma olmuş, paradox herhangi bir sprite için place holder olarak küp kullanmış. Yarın öbür gün bunlar player, enemy falan olacaklar yani :)
 
Paradox, benim de başlangıç seviyesi ancak çalışır durumda bir MMO engine'im var. Aslında yıllar önce başladım kodlamaya ama devam edemedim bir türlü. Çünkü altyapısı hoşuma gitmiyordu, transfer edilen paketleri hazırlamak, göndermek, öteki tarafta açmak için amele yöntemler kullanıyordum. şimdi çok daha güzel bir yapı hazırlayabilecek durumdayım ancak bu projeye sıra gelmesine çok var. Ben uğraşamıyorum, bare tanıdık bir indie developer uğaşsın böyle bir işle :) Sana benden tam destek. ılk preview'ı sabırsızlıkla bekleyeceğim.

Winsock yardım

« Yanıtla #11 : 21.01.2010 21:44:25 »
Hızlı düğmeleri aç

paradox

İleti: 134

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
"Internet uzerinden kup cevirmeye neden ihtiyac duydugunu da anlayamadim. Bu sunucular genelde cok optimize yaziliyorlar. Milyonlarca bilgi gitmiyor paketlerde."

Ben şöyle anladım:Bu sunucular farklı..küple falan denemeyle olmaz..başında 2-3 tane koreli teknisyen gerekli gibi bişey canlandı kafamda:D..Neyse olay anlaşılmış sonuçta..

skate , bende uğraşıyorumda işte sorunumu yazdım..sürekli int,float şeklinde data yollamak yanlışmı..onu anlamadım..Teknoloji gelişti şimdi paket aç kapa uğraşamam..aklım ermedi benim ona:D
« Son Düzenleme: 21.01.2010 21:48:38 Gönderen: paradox »

Winsock yardım

« Yanıtla #12 : 22.01.2010 00:18:39 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
@paradox: En güzel yöntem şu sanırım (şimdi bunu dedim ya on tane daha güzeli gelir hehe). Client ve Server'ın paylaşacağı tüm veri tipleri için birer structure oluşturuyorsun. Örnek;
 
struct Player {
    float x;
    float y;
    char name[25];
};
 
tamamen attım kafadan. Sonra bu structure'ı olduğu gibi gönderiyorsun. Ama nasıl? Bunun için öncelikle datayı serialize etmen gerekiyor. Bunun birkaç yolu var. Aslında yukardaki örnekte 4+4+25 = 33 byte gibi hesaplayıp gönderebilirsin. Ama işin içine pointerlar bulaştımı bu yöntem patlar. Bu nedenle pointerları da referanslarına uygun bir biçimde serialize edebilecek daha gelişmiş bir serialization yöntemi lazım.
 
Bunlar şu anda bulduklarımdan bir kaçı.
 
http://s11n.net/c11n/
http://tpl.sourceforge.net/
http://www.enlightenment.org/p.php?p=about/efl/eet&l=en
 
Eminim daha onlarcası vardır. Bildiğim kadarıyla Nightlord'un kullandığı Boost da bu iş için ideal.
 
http://www.boost.org/doc/libs/1_41_0/libs/serialization/doc/index.html

Winsock yardım

« Yanıtla #13 : 22.01.2010 00:30:31 »
Hızlı düğmeleri aç

endo

İleti: 687

Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.moldibi.com
hehehe walla ben de hydrogenle ayni seyi anlamisim, iki farkli pc'de birbiriyle senkronize donen 2 kup dusundum :P biri digerine "ben sola 72 derece donuyorum hadi sen de don" gibi paketler yolluyor felan :D
- endo of glance -

Winsock yardım

« Yanıtla #14 : 22.01.2010 10:53:14 »
Hızlı düğmeleri aç

deniz

İleti: 22

Çevrimdışı
  • *
  • Newbie
    • Profili Görüntüle
    • http://www.cizbakalim.com
udp mesajlaşma problemlerini (paket kaybı, yer değiştirme vb) acısızca halletmek için enet (http://enet.bespin.org/) gibi bir kütüphane kullanabilirsin. Daha da güzeli raknet gibi çok daha üst seviye bir network kütüphanesi kullanmak olacaktır. Zaten latency ile boğuşmak, client ları anlık lag altında senkronize edebilmek, veri frekansını azaltarak bandwidth den tasarruf etmek ve daha nice problem ile bolca uğraşmak zorunda kalacağın için birde alt seviye sıkıntılar ile debelenmek en son isteyeceğin şey olacaktır.

Eğer haberleşme mimarisinde yüksek oranda veri sıkıştırmaya ihtiyaç duymuyorsan kendi çapında bir rpc mekanizması oluşturmak akıllıca=acısız olacaktır. Bu sayede yeni paket tanımlama, paket yapısı değiştirme gibi bolca olan durumları çok rahat ve hızlı halledebilirsin. Üstelik yapıyı bir kez oturtursan bir daha da bug lar la felan uğraşmadan kodunu diğer kısımlarına konsantre olabilirsin.

Veri transferi garantiye alınmış UDP gibisi de yoktur, bence bundan şaşma. kolay gelsin. bol arge diliyorum.

Son mesajımdan beri öküz zaman geçmiş, kendime de koca bir oha diyorum, ve izleyici sandalyeme geri dönüyorum. - herkese sevgi, saygı.