/// <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); } }