2012-08-05 5 views
7

मैं सेटबफर का उपयोग सॉकेटएसिंसेन्ट आर्ट्स के साथ ठीक कर सकता हूं।सॉकेटएसिंसेन्ट आर्ट्स के साथ बफरलिस्ट का उपयोग कैसे करें और सॉकेटएरर अमान्य अर्ग्यूमेंट प्राप्त नहीं करें?

यदि मैं बफरलिस्ट का उपयोग करने की कोशिश करता हूं (सेटबफर (शून्य, 0, 0) करने के बाद) मैं सॉकेट पर SendAsync करते समय हमेशा और तुरंत सॉकेट एरर अमान्य आर्ग्यूमेंट (10022) प्राप्त करता हूं।

बफरलिस्ट का उपयोग करने के तरीके और मेरे द्वारा किए जा रहे कार्यों पर कोई उदाहरण या दस्तावेज नहीं है (वैसे भी मेरे लिए)।

क्या कोई उदाहरण प्रोग्राम या कोड स्निपेट इंगित कर सकता है?

मैं इस पर मेरे बालों को फाड़ कर रहा हूँ और बहुत ज्यादा नहीं छोड़ दिया है है ...

यहाँ मैं (क्या कर रहा हूँ ई SocketAsyncEventArgs है मूल रूप से है और lSocket एक ही सॉकेट मैं SetBuffer के लिए उपयोग जो काम करता है)

// null the buffer since we will use a buffer list 
e.SetBuffer(null, 0, 0); 

// create a bufferlist 
e.BufferList = new List<ArraySegment<byte>>(); 

// create the bufferlist with the network header and the response bytes 
e.BufferList.Add(new ArraySegment<byte>(lTxBytes)); // add the 4 character total length 
e.BufferList.Add(new ArraySegment<byte>(Encoding.ASCII.GetBytes(lTx.Identity))); // echo back the incoming sequence number 
e.BufferList.Add(new ArraySegment<byte>(Encoding.ASCII.GetBytes(lResponse))); 

// *** the SendAsync always completes IMMEDIATELY (returns false) gets SocketError InvalidArgument (10022) 

if (lSocket.SendAsync(e) == false) 
{ 
     // data was already sent back to the client. 
     AppSupport.WriteLog(LogLevel.Flow, "ProcessReceive had SendAsync complete synchronously (bytes transferred {0}).", e.BytesTransferred); 
     ProcessSend(e); 
} 
+0

यदि आप इसे इस्तेमाल करने वाली भाषा के साथ टैग करते हैं तो आपके पास अपने प्रश्न का उत्तर पाने का एक बेहतर मौका है। –

+0

क्या सभी ArraySegments को एक ही भौतिक बाइट सरणी का हिस्सा बनने की आवश्यकता है? यदि ऐसा है, तो यह बफरलिस्ट को काफी बेकार प्रदान करेगा। क्या किसी ने बफरलिस्ट सफलतापूर्वक उपयोग किया है? – Dave

+0

किसी के पास कोई विचार है? – Dave

उत्तर

9

कारण आप एक अपवाद हो रही है कि हुड के नीचे SocketAsyncEventArgs केवल BufferList संपत्ति की स्थापना के समय में बफ़र्स सूची में मौजूद का उपयोग करता है। करने की कोशिश

e.BufferList = new List<ArraySegment<byte>>(); 
e.BufferList.Add(new ArraySegment<byte>(lTxBytes)); 
e.BufferList.Add(new ArraySegment<byte>(Encoding.ASCII.GetBytes(lTx.Identity))); 
e.BufferList.Add(new ArraySegment<byte>(Encoding.ASCII.GetBytes(lResponse))); 

बजाय: मूल रूप से आप कोड के साथ खाली बफर एन भेजने की कोशिश कर रहे हैं

var list = new List<ArraySegment<byte>>(); 
list.Add(new ArraySegment<byte>(lTxBytes)); 
list.Add(new ArraySegment<byte>(Encoding.ASCII.GetBytes(lTx.Identity))); 
list.Add(new ArraySegment<byte>(Encoding.ASCII.GetBytes(lResponse))); 
e.BufferList = list; 

यह व्यवहार में अच्छी तरह से सब पर दर्ज नहीं किया है और केवल को देखकर समझा जा सकता है विस्तार से BufferList सेटर कोड। SocketAsyncEventArgs के दृश्यों के पीछे WSABuffer सरणी फ़ील्ड (मूल कोड के साथ इंटरऑप के लिए) है जहां यह BufferList सेट करते समय बाइट एरे संदर्भों की प्रतिलिपि बनाता है और पिन करता है। चूंकि यह WSABuffer[] है जो देशी कोड पर भेजा गया है, यह बताता है कि आपका कोड अपवाद क्यों फेंकता है।

+0

धन्यवाद। समझ में आता है लेकिन स्पष्ट नहीं है ... – Dave

+1

निश्चित रूप से नहीं, जब मुझे आपकी पोस्ट मिली और मुझे बहुत निराश हुआ तो कोई भी जवाब नहीं दे रहा था। एमएस वास्तव में इसे बेहतर दस्तावेज करना चाहिए। बहुत बुरा मैं एक साल देर से जवाब दे रहा हूँ;)। – JJ15k

संबंधित मुद्दे