Exemplo n.º 1
0
        /// <summary>
        /// データを送信します。
        /// </summary>
        private void SendDataInternal(int id, bool isResponse,
                                      PbSendData pbSendData, bool isOutLog)
        {
            if (pbSendData == null)
            {
                throw new ArgumentNullException("pbSendData");
            }

            if (pbSendData.SerializedData == null ||
                pbSendData.EncodedTypeName == null)
            {
                throw new PbException("送信データがシリアライズされていません。");
            }

            try
            {
                if (!IsConnected || !CanWrite)
                {
                    // これをthrowすると対処が面倒なので
                    return;
                }

                var typedata = pbSendData.EncodedTypeData;
                var payload  = pbSendData.SerializedData;

                // パケットヘッダを用意します。
                var header = new PbPacketHeader
                {
                    Id             = id,
                    IsResponse     = isResponse,
                    TypeNameLength = typedata.Length,
                    PayloadLength  = payload.Length,
                };
                var headerData = header.GetEncodedPacket();

                // 送信データは複数バッファのまま送信します。
                var sendData = new SendData()
                {
                    Socket = this.Socket,
                };
                sendData.AddBuffer(headerData);
                sendData.AddBuffer(typedata);
                sendData.AddBuffer(payload);

                // データを送信します。
                base.SendData(sendData);

                if (isOutLog)
                {
                    Log.Debug(this,
                              "{0}を送信しました。(content={1}bytes)",
                              pbSendData.TypeName,
                              (payload != null ? payload.Length : -1));
                }
            }
            catch (Exception ex)
            {
                Log.ErrorException(this, ex,
                                   "{0}: 送信データのシリアライズに失敗しました。",
                                   pbSendData.TypeName);
            }
        }