Windows Phone 7和Sockets:我做错了什么?

本文关键字:错了 什么 Phone Sockets Windows | 更新日期: 2023-09-27 18:19:16

所以我建立了一个连接,一切都很顺利,我开始设置代码来读取来自服务器的数据包。我想用一个数据包标识符方法来构建它,该方法读取单个字节(数据包ID),并分支到适当的方法来读取其余部分。问题在于最后一条语句——一切正常,直到我分支,当我得到这个异常:

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

想法吗?

Windows Phone 7和Sockets:我做错了什么?

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