Udp - Client To Client
-
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öndermestring[] 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);
-
hocam eğer işin içinden çıkamazsan wireshark yada fiddler ile trafiği dinle belki paketlerle ilgili bir sorun yaşıyor olabilirsin.
-
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
-
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.
-
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. -
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.
-
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