2011-06-11 17 views
6

我目前正在開發一個應用程序服務器。我想使用AcceptAsync方法。我得到錯誤「對象引用未設置爲對象的實例。」當調用ReceiveAsync方法時。如果有任何提出這個問題,並得到解決辦法呢?C#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

我假設你是否在該行上放置了一個斷點,那麼clientSocket(因此e.AcceptSocket)爲空? e.SocketError返回什麼? – Rich 2011-06-11 10:20:07

+0

我能夠重現這個問題,'clientSocket'是* not *'null',我無法弄清楚。 – svick 2011-06-11 11:20:50

回答

-1

我不知道你爲什麼在兩個地方接受套接字。如果你刪除

AcceptCallback(e); 

從e_Completed一切正常。

它的鏈接,例如異步服務器:

a link

+0

如果你這樣做,一切都在工作,但它什麼都不做。 – svick 2011-06-11 13:48:24

+1

盲目拉出東西直到它工作對軟件來說不是一個好方法。如果您試圖瞭解導致錯誤的原因並修復錯誤,那就太好了。這裏代碼試圖從異步套接字接收數據,而不先分配和分配接收緩衝區。這是應該修復的。 – Indy9000 2011-10-03 14:55:16

7

我有同樣的問題,我設法弄清楚。 您需要向SocketAsyncEventArgs對象提供一個數據緩衝區(字節數組),以在調用ReceiveAsync(e)之前存儲接收到的數據。

void e_Completed(object sender, SocketAsyncEventArgs e) 
{ 
    byte[] buffer = new byte[1024]; 
    e.SetBuffer(buffer, 0, buffer.Length); 
    AcceptCallback(e); 
}