因此,我建立了一个连接,一切正常,然后开始设置代码以从服务器读取数据包。我要构造它的方式是使用一个数据包标识符方法,该方法读取一个字节(数据包ID),然后分支到适当的方法以读取其余字节。问题出在那儿的最后一条语句上-一切正常,直到我分支出来,直到我得到这个异常:



这是一般的想法:

    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);
    }

有什么想法吗?

最佳答案

如果收到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;
    }

关于c# - Windows Phone 7和套接字: What am I doing wrong?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8678706/

10-11 02:42