1

編集: 私がここでやろうとしていたことと答えのより簡潔な説明

ソースからデータを受信するために C# 非同期ソケットを使用しています。

私の問題は、受信するデータがさらにある場合、受信したデータをどのように、どこに保存するかです。

文字列を受信したら、文字列ビルダーを使用して、msdn から次のように受信して保存できます。

private void ReceiveCallback_onQuery(IAsyncResult ar)
        {
            try
            {
                // Retrieve the state object and the client socket 
                // from the asynchronous state object.
                StateObject state = (StateObject)ar.AsyncState;
                Socket client = state.workSocket;

                // Read data from the remote device.
                int bytesRead = client.EndReceive(ar);

                if (bytesRead > 0)
                {
                    // There might be more data, so store the data received so far.
                    dataReceived += state.buffer; //Does not work (dataReceived is byte[] type)

                    // Get the rest of the data.
                    client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                        new AsyncCallback(ReceiveCallback_onQuery), state);
                }
                else
                {
                    // All the data has arrived; put it in response.
                    if (dataReceived > 1)
                    {
                        response_onQueryHistory = ByteArrayToObject(dataReceived)
                    }
                    // Signal that all bytes have been received.
                    receiveDoneQuery.Set();
                    }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }

私の場合のように、受信したデータを文字列に変換したくありません。複雑なオブジェクトを受信して​​います。

送信されたデータはシリアル化されており、逆シリアル化も問題ありません。

文字列ビルダーを使用せずにソケットからデータを「継続的に」受信する方法についての私の質問です。

ありがとう!

4

2 に答える 2

1
My problem is how and where to store received data if there are more to be received?

Buffer.BlockCopyを使用して、キューに入れることができます。たとえば、

           int rbytes = client.EndReceive(ar);

            if (rbytes > state.buffer)
            {
                byte[] bytesReceived = new byte[rbytes];
                Buffer.BlockCopy(state.buffer, 0, bytesReceived, 0, rbytes);
                state.myQueue.Enqueue(bytesReceived);                
                    client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                    new AsyncCallback(ReceiveCallback_onQuery), state)
            }
于 2012-11-19T11:47:27.023 に答える
1

これは、複雑なものが細分化されたバイトでワイヤにプッシュされる前にどのようにシリアル化されるかによって異なります。これらのバイトを受け取り、シリアル化に使用したのと同じアルゴリズム/手法を使用して元の状態に逆シリアル化します。

より具体的な回答については、より具体的にお聞かせください。

于 2012-11-19T11:29:49.700 に答える