2011-12-30 35 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