2010-03-09 26 views
9

biz UDP almak için bildiği gibi,. İçinde UDP veri koymak için bir bayt dizisi kabul Socket.ReceiveFrom veya UdpClient.receiveAlttaki Soket UDP için arabellek boyutunu nasıl ayarlayabilirim? C#

Socket.ReceiveFrom kullanmak

UdpClient.receive doğrudan byte döndüren Verilerin

olduğu dizi Sormam, Soket içindeki arabellek boyutunu nasıl ayarlayacağımızdır. İşletim sisteminin UDP verilerini almak için kendi arabellekini koruduğunu düşünüyorum, doğru mu? örneğin, bir udp paketi makineme gönderilirse, işletim sistemi bir arabelleğe koyacaktır ve bizi Socket.ReceiveFrom veya UdpClient.receive'ye yönlendirecektir, değil mi?

Dahili arabelleğin boyutunu nasıl değiştirebilirim?

Socket.ReceiveBuffSize'i denedim, UDP için hiç bir etkisi yok ve açıkça TCP penceresi için olduğunu söyledi. Ayrıca, Socket.ReceiveBufferSize'in UDP için DEĞİLDİĞİNİ kanıtlayan çok fazla deney yaptım.

Herkes, UDP dahili arabelleği hakkında bazı bilgileri paylaşabilir mi ??? Ben mesela için, burada bazı mesajları gördük

sayesinde

http://social.msdn.microsoft.com/Forums/en-US/ncl/thread/c80ad765-b10f-4bca-917e-2959c9eb102a

Dave Socket.ReceiveBufferSize UDP iç tampon ayarlayabilirsiniz söyledi. Katılmıyorum.

denemeler yaptım şu şekildedir:

27 barındıran (en azından neredeyse) aynı anda bir LAN içinde bana 10 KB'lık udp paketi gönderebilir. Paketin her birini idare etmek için bir zaman döngüsüm var. Her paket için bir iş parçacığı bir tanıtıcı oluşturur. Paketleri almak için UdpClient veya Soket kullandım.

Paketlerin yaklaşık% 50'sini kaybettim. Bence UDP'nin gönderdiği patlamanın bir patlaması ve hepsini zamanında ele alamıyorum.

Bu yüzden UDP için arabellek boyutunu artırmak istiyorum. Tampon boyutunu 1 MB olarak değiştirirsem tamponda 27 * 10KB = 270KB veri kabul edilebilir, değil mi?

Çok sayıda değere Socket.ReceiveBufferSize değiştirmeyi denedim ve yalnızca hiç bir etkisi yok.

Herhangi biri yardımcı olabilir?

cevap

9

Genellikle .NET UDPClient'i kullanıyorum ve her zaman Socket.ReceiveBufferSize'u kullandım ve iyi sonuçlar aldım. Dahili olarak Socket.SetSocketOption'u ReceiveBuffer parametresiyle çağırır.

public static void Main(string[] args) 
{ 
    IPEndPoint remoteEp = null; 
    UdpClient client = new UdpClient(4242); 
    client.Client.ReceiveBufferSize = 4096; 

    Console.Write("Start sending data..."); 
    client.Receive(ref remoteEp); 
    Console.WriteLine("Good"); 

    Thread.Sleep(5000); 
    Console.WriteLine("Stop sending data!"); 
    Thread.Sleep(1500); 

    int count = 0; 
    while (true) 
    { 
    client.Receive(ref remoteEp); 
    Console.WriteLine(string.Format("Count: {0}", ++count)); 
    } 
} 

ReceiveBufferSize geçirilen değeri ayarlamayı deneyin: Burada ile test edebilirsiniz bir bazı hızlı, basit, koddur. 5 saniye boyunca sürekli bir veri akışı göndermeyi test ettim ve 10 paket aldım. Daha sonra x4 artırdım ve bir dahaki sefere 38 paket var.

Ağınızda paketlerinizin düştüğü diğer yerlere bakardım. Özellikle, other post numaranızda 10KB paketler gönderdiğinizden bahsetmişsiniz. Paketler MTU'nun boyutuna gönderildiğinde 10KB parçalara ayrılacaktır. Serideki 1 paketin tümü düşerse, paketin tamamı bırakılır.

+0

@heavyd: Cevabınız için teşekkürler. Benim kodum sizinkilere çok benziyor. ama ilgileniyorsanız basit bir deney yapabilirsiniz. ayrı iki sınıfa - Sunucu ve İstemcimiz var. Client.cs'inizde , UdpClient'i sadece yerel paketinize 8888'e 200 paket (her bir bağlantı noktası) göndermek için kullanın (istediğiniz herhangi bir bağlantı noktası) , kodunuzda gösterildiği gibi sürekli olarak alıyorsunuz Elbette, lütfen öncelikle server.cs dosyasını çalıştırın. Sonuçta, paketlerin% 90'ı alınabilir. Nokta UDP'nin gönderilmesi, çok fazla paketin geldiği ve sunucunuzun işleyemediği bir patlamadır. ve tampon taşar. – Jack

+0

Evet ve ReceiveBufferSize değerini "4096" dan daha yüksek bir değere ayarlamanın "4 * 4096" nın hiçbir şey yapmadığını mı söylüyorsun? – heavyd

+0

@heavyd, ReceiveBufferSize için üst sınırın ne olduğunu bilir miyim? – Jack

7

ReceiveBufferSize ayarı ile ilgili sorun, doğrudan UdpClient nesnesinin oluşturulmasından sonra ayarlamanız gerektiğidir. ReceiveBufferSize değerini alırken değişikliklerin yansımasıyla aynı sorunu yaşadım.

UdpClient client = new UdpClient() 
//no code inbetween these two lines accessing client. 
client.Client.ReceiveBufferSize = somevalue 
İlgili konular