0

以下のコードの状態は、メッセージの合計長であるプロパティ msgLength を持つオブジェクトです。msgLength は、メッセージの最初の 4 バイトです。複数のメッセージを「すばやく」連続して受信すると、state.msgLength プロパティで予期しない結果が得られます。state.msglength が期待どおりでない場合、受信しようとするとエラーが発生します。指定された引数は有効な値の範囲外です。

              StateObj state = (StateObj)ar.AsyncState;

            try
            {
                state.read += state.socket.EndReceive(ar);
                if (state.read == 0)
                {
                    state.socket.Close();
                    state.socket.Dispose();
                    state.socket = null;
                    this.Invoke((MethodInvoker)delegate { listBox1.Items.Add(DateTime.Now.ToString("HH:mm ss") + " socket closed"); });
                    return;
                }
            }
            catch (Exception)
            {
                this.Invoke((MethodInvoker)delegate { listBox1.Items.Add(DateTime.Now.ToString("HH:mm ss") + " socket closed"); });
                return;
            }
            if (state.read < 4)
            {
                //read again you dont have state,msglength
                state.socket.BeginReceive(state.dataBuffer, state.read, 4 - state.read, 0, cbReceive, state);
            }
            else
            {
                state.msglength = BitConverter.ToInt32(state.dataBuffer, 0);
            }
            if (state.read < state.msglength)
            {
                //read again you dont have the complete message 
                //here is the error Specified argument was out of the range of valid values. 
                state.socket.BeginReceive(state.dataBuffer, state.read, state.msglength - state.read, 0, cbReceive, state);
            }
            else
            {
            //process here
             if (state.read > state.msglength )
                {
                    state.read = state.read - state.msglength;
                }
                else
                {
                    state.read = 0;
                }
                state.socket.BeginReceive(state.dataBuffer, 0, state.dataBuffer.Length, 0, cbReceive, state);
            }
4

1 に答える 1