2011-12-30 87 views
2

所以我建立了一個連接,一切都很好,我開始設置代碼從服務器讀取數據包。我想要構造它的方式是使用一個數據包標識符方法,該方法讀取單個字節(數據包ID)並分支到適當的方法以讀取其餘部分。問題在於最後一個語句 - 一切正常,直到我分支,當我得到這個異常:Windows Phone 7和套接字:我做錯了什麼?

使用此SocketAsyncEventArgs實例的異步套接字操作已在進行中。

這裏的總體思路:

private void IdentifyPacket(object sender, SocketAsyncEventArgs e) 
    { 
     e.Completed -= new EventHandler<SocketAsyncEventArgs>(IdentifyPacket); 
     if (e.SocketError != SocketError.Success) 
     { 
      ForceDisconnectWithError(new SocketErrorEventArgs(netSocket, e.SocketError)); 
      return; 
     } 

     PacketID packet = (PacketID)e.Buffer[0]; 

     switch (packet) 
     { 
      case PacketID.KeepAlive: 
       e.SetBuffer(new byte[4], 0, 4); 
       e.Completed += new EventHandler<SocketAsyncEventArgs>(HandleKeepAlive); 
       e.ConnectSocket.ReceiveAsync(e); 
       break; 
      default: 
       RelinkPacketManager(); 
       break; 
     } 
    } 

    private void RelinkPacketManager() 
    { 
     socketConfig.SetBuffer(new byte[1], 0, 1); 
     socketConfig.Completed += new EventHandler<SocketAsyncEventArgs>(IdentifyPacket); 
     netSocket.ReceiveAsync(socketConfig); 
    } 

的思考?

回答

0

如果您收到Packet.KeepAlive,您是否發送另一個請求?或者等待更多的數據被接收? 如果你需要獲得剩餘的數據字節,你可能已經在e.Buffer[0]之後的字節中得到了它。 因此,不要事先設置緩衝區大小,而應該嘗試徹底解析您的響應。

希望有所幫助。

編輯: 嘗試這個

SocketAsyncEventArgs args; 
switch (packet) 
     { 
      case PacketID.KeepAlive: 
       args.SetBuffer(new byte[4], 0, 4); 
       args.Completed += new EventHandler<SocketAsyncEventArgs>(HandleKeepAlive); 
       e.ConnectSocket.ReceiveAsync(args); 
       break; 
      default: 
       RelinkPacketManager(); 
       break; 
    } 
+0

e.Buffer的長度爲1的運行IdenfityPacket方法時。 – SirCmpwn 2011-12-30 11:42:58

+0

嗯,我的意思是,你的回答如何?你的響應可能與這個'[0x01,0x0A,0x0B]'一樣,所以當你使用'e.Buffer [0]'時,即使你需要收集的數據是正確的,你也會跳過'0x0A'和'0x0B'在假設'[0x01]'表示'KeepAlive'的第一個字節之後。 – abhinav 2011-12-30 11:50:10

+0

我有工作方法,使用這個系統的「接收部分,推遲其餘的」所有數據都被正確接收。 – SirCmpwn 2011-12-30 18:53:57