2011-06-11 10 views
6

मैं वर्तमान में एक ऐप्स सर्वर विकसित कर रहा हूं। मैं AcceptAsync विधि का उपयोग करना चाहता हूं। मुझे त्रुटि मिली "ऑब्जेक्ट रेफरेंस ऑब्जेक्ट के उदाहरण पर सेट नहीं है।" ReceiveAsync विधि को कॉल करते समय। अगर कोई इस समस्या के साथ आया है और इसका समाधान मिला है?सी # ReceiveAsync त्रुटि

public class AppServer 
{ 
    public void Start() 
    { 
     Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
     serverSocket.Bind(new IPEndPoint(IPAddress.Any, 12345)); 
     serverSocket.Listen(100); 

     SocketAsyncEventArgs e = new SocketAsyncEventArgs(); 
     e.Completed += new EventHandler<SocketAsyncEventArgs>(e_Completed); 

     bool raiseEvent = serverSocket.AcceptAsync(e); 
     if (!raiseEvent) 
      AcceptCallback(e); 
    } 

    void e_Completed(object sender, SocketAsyncEventArgs e) 
    { 
     AcceptCallback(e); 
    } 

    private void AcceptCallback(SocketAsyncEventArgs e) 
    { 
     SocketAsyncEventArgs readEventArgs = new SocketAsyncEventArgs(); 
     readEventArgs.Completed += new EventHandler<SocketAsyncEventArgs>(readEventArgs_Completed); 

     Socket clientSocket = e.AcceptSocket; 
     bool raiseEvent = clientSocket.ReceiveAsync(readEventArgs); // <-- Error goes here 
     if (!raiseEvent) 
      ReceiveCallback(readEventArgs); 
    } 

    void readEventArgs_Completed(object sender, SocketAsyncEventArgs e) 
    { 
     ReceiveCallback(e); 
    } 

    private void ReceiveCallback(SocketAsyncEventArgs e) 
    { 

    } 
} 
+0

मुझे लगता है कि क्या आप उस लाइन पर ब्रेकपॉइंट डालते हैं तो क्लाइंट सॉकेट (और इसलिए ई.एसेप्टस्केट) शून्य है? E.SocketError वापस क्या करता है? – Rich

+0

मैं समस्या को पुन: उत्पन्न करने में सक्षम हूं और 'क्लाइंट सॉकेट' * नहीं * 'शून्य 'है, मैं इसे समझने में असमर्थ हूं। – svick

उत्तर

-1

मुझे यकीन नहीं है कि आप दो जगहों में सॉकेट स्वीकार क्यों करते हैं। यदि आप

AcceptCallback(e); 

e_Completed सब कुछ काम कर रहा है।

यह उदाहरण अतुल्यकालिक सर्वर के लिए लिंक:

a link

+0

यदि आप ऐसा करते हैं, तो सबकुछ काम कर रहा है, लेकिन यह कुछ भी नहीं करता है। – svick

+1

जब तक यह काम नहीं करता है तब तक चीजें खींचें, सॉफ़्टवेयर के लिए एक अच्छी विधि नहीं है। यह अच्छा होगा यदि आप समझने की कोशिश करते हैं कि त्रुटि का कारण क्या है और इसे ठीक करें। और यहां कोड एक एसिंक सॉकेट से पहले डेटा आवंटित करने और प्राप्त करने वाले बफर को असाइन किए बिना डेटा प्राप्त करने का प्रयास कर रहा है। यही तय किया जाना चाहिए। – Indy9000

7

मैं एक ही समस्या थी और मैं यह पता लगाने में कामयाब रहे। आपको ReceiveAsync (e) को कॉल करने से पहले प्राप्त डेटा को संग्रहीत करने के लिए अपने सॉकेटएसिंक EventArgs ऑब्जेक्ट को डेटा बफर (बाइट सरणी) प्रदान करने की आवश्यकता है।

void e_Completed(object sender, SocketAsyncEventArgs e) 
{ 
    byte[] buffer = new byte[1024]; 
    e.SetBuffer(buffer, 0, buffer.Length); 
    AcceptCallback(e); 
} 
संबंधित मुद्दे