/// <summary> /// データを送信データキューに追加します。 /// </summary> internal static void AddSendData(SendData sendData) { if (sendData == null || !sendData.Buffers.Any() || sendData.Socket == null) { return; } lock (SyncObject) { sendDataList.Add(sendData); Monitor.PulseAll(SyncObject); } }
/// <summary> /// BeginSend(IList<ArraySegment<byte>>, ...)が使えない /// 環境があるので、その場合は複数のデータを一つのバッファにまとめます。 /// </summary> private static byte[] MergeBuffer(SendData sendData, out int length) { // バッファサイズを計算します。 length = 0; foreach (var data in sendData.Buffers) { length += data.Count - data.Offset; } // 実際に確保されたバッファサイズと、送信サイズは違う可能性が // 考えられます。 using (var stream = new MemoryStream(length)) { foreach (var data in sendData.Buffers) { stream.Write(data.Array, data.Offset, data.Count); } stream.Flush(); return stream.GetBuffer(); } }
/// <summary> /// データの送信終了後に呼び出されます。 /// </summary> private void RaiseSent(SendData sendData, Exception error) { // TODO: var e = new DataEventArgs( null, /*(sendData != null ? sendData.Buffer : null)*/ error); // 継承メソッドを呼びます。 Util.SafeCall(() => OnSent(e)); // eventを呼びます。 this.Sent.SafeRaiseEvent(this, e); }
/// <summary> /// データを非同期で送信します。 /// </summary> public void SendData(SendData data) { if (data == null) { throw new ArgumentNullException("data"); } lock (this.socketLock) { if (!IsConnected || !CanWrite) { return; } data.Callback += RaiseSent; SendThread.AddSendData(data); } }
/// <summary> /// データを非同期で送信します。 /// </summary> public void SendData(byte[] data) { if (data == null) { throw new ArgumentNullException("data"); } lock (this.socketLock) { var sendData = new SendData { Socket = Socket, }; sendData.AddBuffer(data, 0, data.Length); SendData(sendData); } }
/// <summary> /// 送信完了(失敗)をコールバックを通して伝達します。 /// </summary> private static void RaiseSent(SendData sendData, Exception ex) { Util.SafeCall(() => sendData.OnSent(ex)); }