2010-03-09 7 views
9

हम यूडीपी प्राप्त के लिए जानते हैं, हम Socket.ReceiveFrom या UdpClient.receiveमैं सॉकेट यूडीपी के नीचे बफर आकार कैसे सेट कर सकता हूं? सी #

Socket.ReceiveFrom का उपयोग करें। एक बाइट सरणी स्वीकार आप में यूडीपी डेटा डाल करने के लिए से

UdpClient.receive सीधे एक बाइट रिटर्न सरणी जहां डाटा

मेरा प्रश्न है कैसे सॉकेट अंदर बफर आकार निर्धारित करने के लिए है। मुझे लगता है कि ओएस यूडीपी डेटा प्राप्त करने के लिए अपने बफर को बनाए रखता है, है ना? उदाहरण के लिए, यदि मेरी मशीन पर एक udp पैकेट भेजा जाता है, तो ओएस इसे एक बफर में रखेगा और हमें सॉकेट पर प्रतीक्षा करेगा। ReceiveFrom या UdpClient.receive, है ना?

मैं उस आंतरिक बफर के आकार को कैसे बदल सकता हूं?

मैं Socket.ReceiveBuffSize की कोशिश की है, यह बिल्कुल यूडीपी के लिए कोई प्रभाव नहीं है, और यह स्पष्ट रूप से कहा कि यह TCP विंडो के लिए है। इसके अलावा मैंने बहुत सारे प्रयोग किए हैं जो सॉकेट साबित करते हैं। रिसीव बफर आकार यूडीपी के लिए नहीं है।

किसी यूडीपी आंतरिक बफर के लिए कुछ अंतर्दृष्टि साझा कर सकते हैं ???

धन्यवाद

मैं जैसे के लिए यहाँ कुछ पदों को देखा है,,

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

डेव ने कहा Socket.ReceiveBufferSize यूडीपी के लिए आंतरिक बफर सेट कर सकते हैं कि। मैं असहमत हूं।

प्रयोग मैंने किया था इस तरह है:

27 मेजबान एक ही समय में एक लैन के भीतर मेरे लिए एक 10KB udp पैकेट भेज (कम से कम लगभग)। मेरे पास प्रत्येक पैकेट को संभालने के लिए थोड़ी देर लूप है। प्रत्येक पैकेट के लिए, मैं एक धागा इसे संभालता हूं। मैंने पैकेट प्राप्त करने के लिए UdpClient या सॉकेट का उपयोग किया।

मैंने लगभग 50% पैकेट खो दिए। मुझे लगता है कि यह यूडीपी भेजने का एक विस्फोट है और मैं समय पर उन सभी को संभाल नहीं सकता।

यही कारण है कि मैं यूडीपी के लिए बफर आकार बढ़ाना चाहते हैं। कहें, अगर मैं बफर आकार को 1 एमबी में बदलता हूं, तो 27 * 10 केबी = 270 केबी डेटा बफर में स्वीकार किया जा सकता है, है ना?

मैं कई कई मूल्यों के Socket.ReceiveBufferSize बदलते कोशिश की, और यह सिर्फ सब पर प्रभाव नहीं है।

कोई भी मदद कर सकता है?

उत्तर

9

मैं अक्सर नेट UDPClient का उपयोग करें और मैं हमेशा Socket.ReceiveBufferSize का इस्तेमाल किया और अच्छा परिणाम है। आंतरिक रूप से यह पैरामीटर के साथ Socket.SetSocketOption पर कॉल करता है।

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 में पारित मूल्य समायोजित करने का प्रयास: यह एक कुछ त्वरित, सरल, कोड आप के साथ परीक्षण कर सकते हैं है। मैंने 5 सेकंड के लिए डेटा की निरंतर स्ट्रीम भेजने का परीक्षण किया, और 10 पैकेट मिला। मैंने फिर x4 बढ़ाया और अगली बार 38 पैकेट मिले।

मैं आपके नेटवर्क में अन्य स्थानों पर देखता हूं जहां आप पैकेट छोड़ सकते हैं। खासकर जब से आप अपने other post पर उल्लेख करते हैं कि आप 10 केबी पैकेट भेज रहे हैं। जब यह एमटीयू के आकार को पैकेट में भेजा जाता है तो 10 केबी को खंडित किया जाएगा। यदि श्रृंखला में कोई भी 1 पैकेट गिरा दिया गया है तो पूरे पैकेट को गिरा दिया जाएगा।

+0

@heavyd: आपके उत्तर के लिए धन्यवाद। मेरा कोड आपके जैसा ही है। लेकिन यदि आप रुचि रखते हैं, तो आप एक साधारण प्रयोग कर सकते हैं। हमारे पास अलग-अलग दो वर्ग हैं - सर्वर और क्लाइंट। अपने क्लाइंट.cs में, आप बस अपने स्थानीय पोर्ट 8888 पर 200 पैकेट (10 केबी प्रत्येक) भेजने के लिए UdpClient का उपयोग करते हैं। (जो भी पोर्ट आप चाहते हैं) अपने सर्वर.cs में, आप लगातार अपने कोड में दिखाए गए जैसे ही प्राप्त करते हैं बेशक, कृपया पहले अपना server.cs चलाएं। मेरा परिणाम 9 0% पैकेट प्राप्त किए जा सकते हैं। मुद्दा यह है कि यूडीपी भेजना एक विस्फोट है कि बहुत से पैकेट आते हैं और आपका सर्वर संभाल नहीं सकता है। और बफर ओवरफ्लो। – Jack

+0

हां, और क्या आप कह रहे हैं कि एक मूल्य से ReceiveBufferSize समायोजित करें, '4096' उच्च मान पर कहें,' 4 * 4096' कुछ भी नहीं करता है? – heavyd

+0

@heavyd, क्या मुझे पता है कि ReceiveBufferSize के लिए ऊपरी सीमा क्या है? – Jack

7

ReceiveBufferSize सेट करने के साथ समस्या यह है कि आपको UdpClient ऑब्जेक्ट के निर्माण के बाद इसे सीधे सेट करने की आवश्यकता है। मेरे पास वही समस्या थी जो मेरे परिवर्तनों को ReceiveBufferSize के मान प्राप्त करते समय प्रतिबिंबित नहीं किया जा रहा था।

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