Udp - Client To Client

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    h0rtl4kk
    h0rtl4kk's avatar
    Kayıt Tarihi: 10/Şubat/2014
    Erkek

    Merhabalar, udp socket kullandığım projemde clientten cliente veri göndermek istiyorum. 2 gündür araştırıyorum bir kaç işlem denedim ama bazı hatalar aldım ve okuduğum farklı bilgiler kafamı karıştırdı.

    Server kısmında nodejs, client kısmında c# kullanıyorum.(Client için UdpClient kullanıyordum ama Socket ile değiştirdim).
    Şuanda client tarafında SendTo(byteArray, server ip/port) ve ReceiveFrom(data, flagNone, ref ip) fonksiyonlarıyla server ile haberleşebiliyorum.

    Gerekli şartlar sağlandığında odaya giren clientler verilerini server üzerinden diğer clientlere aktarıyor. Yani client1 servera veri gönderiyor. Serverda bu gelen veriyi odadaki diğer clientlere gönderiyor.

    Burada yapmak istediğim odada bulunan clientlerin bazı verilerini sunucu aracılığı ile göndertmek yerine doğrudan ip ve portu bilinen diğer clientlere göndertmek.

    SendTo fonksiyonunda ip/port kısmına diğer clientin bilgilerini yazdığımda veriyi gönderiyor ama diğer clientte ReceiveFrom tetiklenmiyor.

    Bu kısımda takıldım kaldım. Araştırdığım kadarıyla bu işlem yapılabiliyor. Hole Punching adında bir işlemden bahsetmişler fakat tam çözemedim.

    Bilgisi/fikri olanlardan yardım bekliyorum.

    Veri gönderme

    string[] ownerIp = players[i].name.Split(':');
                        IPEndPoint end = new IPEndPoint(IPAddress.Parse(ownerIp[0]), int.Parse(ownerIp[1]));
                        try {
                            socket.SendTo(data, data.Length, SocketFlags.None, end);
                        } catch (Exception e) {
                            Debug.LogError(e.ToString());
                        }

    Veri alma

    EndPoint anyIP = new IPEndPoint(IPAddress.Any, 0);
                        byte[] data = new byte[2048];
                        socket.ReceiveFrom(data, SocketFlags.None, ref anyIP);
                        Debug.Log(anyIP);

     

    h0rtl4kk tarafından 21/Kas/19 16:58 tarihinde düzenlenmiştir
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    TeRRoR
    TeRRoR's avatar
    Kayıt Tarihi: 06/Nisan/2007
    Erkek

    hocam eğer işin içinden çıkamazsan wireshark yada fiddler ile trafiği dinle belki paketlerle ilgili bir sorun yaşıyor olabilirsin.


    herkes programcı olmak zorunda değildir, lütfen bir zorunluluk gibi programlama dilleri öğrenmeye çalışmayın. yabancı dil filan öğrenin amq.// s.kimin etini yerim, kasaba minnet etmem.// ince düşünene kalın girer.//
  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    unbalanced
    unbalanced's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek

    ilk söyledigin seyi ben suan yapiyorum hocam, sem samoro, dorel .net in socketini kullaniyorsun ben socket.io üzerinden yapiyorum ve serverim da nodejs.

    bunu söylememin sebebi su, firmada var olan uygulama zaten senin dedigin sekilde calisiyor ve müsteriler cok sikayetci oluyor. Cünkü gerek ag ayarlari gerek firewaller, gerekse de antivirusler bu sikintiya sebep olabiliyor. O yüzden socket.io üzerinden bir cözüm gelistirdim ve suan testler sorunsuz olarak gidiyor.

    Bahsettigin seyi de testlerimde denemistim ama local makine üzerinden (farkli networkda da olsa calisacagini düsünüyorum). Socket.io'yu kullanarak dedigin seyi dene bakalim..

    EngineIoClientDotNet kullaniyorum (nuget paketi). Yalniz dikkat etmen gereken artik güncellenmiyor. O yüzden her seyini iyice deneyip calistigindan emin ol, olasi bi hatada isin icinden cikamayabilirsin. Ben bunu göze alarak yapiyorum simdilik


    Ülkesini Seven Her Türk Vatandasi, Ülkesinin Sessiz Istilasi'na karsi durmak zorunda.
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    MhmdAlmz
    MhmdAlmz's avatar
    Kayıt Tarihi: 09/Ağustos/2015
    Erkek

    Ek olarak Socket.IO da desteğe ihtiyacın olursa da bir PM kadar uzağındayım hocam.

    Socket.IO çok başarılı bir kütüphane denemeni tavsiye ederim.

    Yada SignalR da kullanabilirsin dotnet tarafında.


    Andolsun kuşluk vaktine ve dindiği zaman o geceye ki, Rabbin sana veda etmedi ve darılmadı! Ve kesinlikle senin için sonu önünden (ahiret dünyadan) daha hayırlıdır. ileride Rabbin sana verecek de hoşnut olacaksın! O, seni bir yetim iken barındırmadı mı? Seni, yol bilmez iken (doğru) yola koymadı mı? Seni bir yoksul iken zengin etmedi mi? Öyle ise, sakın yetime kahretme (onu horlama)! El açıp isteyeni de azarlama! Fakat Rabbinin nimetini anlat da anlat!
  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    h0rtl4kk
    h0rtl4kk's avatar
    Kayıt Tarihi: 10/Şubat/2014
    Erkek
    unbalanced bunu yazdı

    ilk söyledigin seyi ben suan yapiyorum hocam, sem samoro, dorel .net in socketini kullaniyorsun ben socket.io üzerinden yapiyorum ve serverim da nodejs.

    bunu söylememin sebebi su, firmada var olan uygulama zaten senin dedigin sekilde calisiyor ve müsteriler cok sikayetci oluyor. Cünkü gerek ag ayarlari gerek firewaller, gerekse de antivirusler bu sikintiya sebep olabiliyor. O yüzden socket.io üzerinden bir cözüm gelistirdim ve suan testler sorunsuz olarak gidiyor.

    Bahsettigin seyi de testlerimde denemistim ama local makine üzerinden (farkli networkda da olsa calisacagini düsünüyorum). Socket.io'yu kullanarak dedigin seyi dene bakalim..

    EngineIoClientDotNet kullaniyorum (nuget paketi). Yalniz dikkat etmen gereken artik güncellenmiyor. O yüzden her seyini iyice deneyip calistigindan emin ol, olasi bi hatada isin icinden cikamayabilirsin. Ben bunu göze alarak yapiyorum simdilik

    Udp'ye çevirmeden önce socket.io'da tcp kullanıyordum. Tcp hız bakımından yetersiz kaldığı için Udp'ye geçtim. Socket.io'nunda udp desteği olmadığı için yine nodejsde dgram kullanarak socket.io ile neredeyse aynı sistemde udp halini yazdım.(Neredeyse aynı derken .on('tetiklenecekFonksiyon') işlemini kastediyorum.)
    Altyapıyı çok fazla zaman harcamadan udpye çevirebildim.

    Online oyun olduğu için sadece oyun oynandığı süre boyunca sunucu olmadan clientler arası veriyi göndermem lazım. Ya bu halini kullanacağım ya da bu dediğim işlemi yapacağım. Altyapıda daha fazla değişiklik yapmak istemiyorum.

  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    h0rtl4kk
    h0rtl4kk's avatar
    Kayıt Tarihi: 10/Şubat/2014
    Erkek
    MhmdAlmz bunu yazdı

    Ek olarak Socket.IO da desteğe ihtiyacın olursa da bir PM kadar uzağındayım hocam.

    Socket.IO çok başarılı bir kütüphane denemeni tavsiye ederim.

    Yada SignalR da kullanabilirsin dotnet tarafında.

    Sağolasın hocam. Üst mesajda yazdığım gibi araştırdığım kadarıyla socket.io'da udp desteği yok. Önceden socket.io kullanıyordum zaten.

  7. KısayolKısayol reportŞikayet pmÖzel Mesaj
    RockZs
    RockZs's avatar
    Kayıt Tarihi: 30/Haziran/2002
    Erkek

    https://stackoverflow.com/questions/23176800/whats-so-hard-about-p2p-hole-punching

    "Firewalls are typically stateful. Bob (2) establishing communications with the outside directory server sets up a rule in his NAT server that allows Bob and the directory server to communicate. When the NAT server sees packets from Alice, it rejects/drops them because it hasn't seen Bob establish communications with Alice."

    "One problem is that the NAT mappings in Alice's NAT server will time out, either after a fixed time, or after a period of inactivity."

    "UDP hole punching success rate is 82% TCP hole punching success rate is 64% I have done many UDP hole punching experiments and they were mostly all successful but not same in the case of TCP hole punching."

    Hole Punching ile ilgili bazı yorumlar böyle. Başarılı olmamasının nedeni iki makinenin bulunduğu ağdaki NAT ayarlarıyla ilgili.

    Şöyle birşey yapılabilir:

    1. WebRTC yi araştırabilirsin. Peer-to-Peer iletişimde giderek yaygınlaşan bir iletişim türü (UDP destekleniyor mu bilmiyorum).

    2. Clientlerde ayrıca sunucular oluşturup, merkezi bir sunucuda bu clientlere ait sunucu bilgilerini diğer clientlere paslayıp, ihtiyaç halinde clientlerin birbirinin sunucusuna bağlanması gibi bir senaryo uygulanabilir.

    RockZs tarafından 21/Kas/19 17:32 tarihinde düzenlenmiştir
Toplam Hit: 1563 Toplam Mesaj: 7
udp udpclient hole punching client to client