예제 #1
0
        /// <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);
            }
        }
예제 #2
0
        /// <summary>
        /// BeginSend(IList&lt;ArraySegment&lt;byte&gt;&gt;, ...)が使えない
        /// 環境があるので、その場合は複数のデータを一つのバッファにまとめます。
        /// </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();
            }
        }
예제 #3
0
        /// <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);
        }
예제 #4
0
        /// <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);
            }
        }
예제 #5
0
        /// <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);
            }
        }
예제 #6
0
 /// <summary>
 /// 送信完了(失敗)をコールバックを通して伝達します。
 /// </summary>
 private static void RaiseSent(SendData sendData, Exception ex)
 {
     Util.SafeCall(() =>
         sendData.OnSent(ex));
 }