Windows Phone 7 и Sockets: что я делаю не так? - PullRequest
2 голосов
/ 30 декабря 2011

Итак, я установил соединение, все работает отлично, и я начинаю настраивать код для чтения пакетов с сервера. Я хочу структурировать его с помощью одного метода идентификатора пакета, который считывает один байт (идентификатор пакета) и разветвляется на соответствующий метод для чтения в остальной части. Проблема заключается в последнем утверждении - все работает, пока я не разветвляюсь, когда получаю это исключение:

Асинхронная операция с сокетом уже выполняется с использованием этого экземпляра 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);
    }

Мысли

1 Ответ

0 голосов
/ 30 декабря 2011

Если вы получаете Packet.KeepAlive, отправляете ли вы еще один запрос? Или просто ждать получения дополнительных данных? Если вам нужно получить оставшиеся байты данных, возможно, они уже есть в ответе в байтах после e.Buffer[0]. Таким образом, вместо того, чтобы устанавливать размер буфера перед началом работы, вы должны попытаться полностью разобрать ваш ответ.

Надеюсь, это поможет.

EDIT: Попробуйте это

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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...