Exemplo n.º 1
0
        public override bool Write(SocketService socketService, IWriteStream writeSteam)
        {
            if (socketService == null)
            {
                Logger.Error($"{nameof(socketService)} 为 null !");
                return(false);
            }

            if (writeSteam == null)
            {
                socketService.OnError($"{nameof(writeSteam)} 为 null !");
                return(false);
            }

            return(WriteMessage(socketService, SendOption.Fragment, writeSteam));
        }
Exemplo n.º 2
0
        private void BeginRead(SocketService socketService)
        {
            if (socketService == null)
            {
                Logger.Error($"{nameof(socketService)} 为 null !");
                return;
            }

            var endPoint   = socketService.Connection.LocalAddress;
            var readStream = PoolAllocator <IReadStream> .GetObject();

            var byteFragment = readStream.GetReadBuffer();

            try {
                lock (_receiveLock) {
                    _readSocket.BeginReceiveFrom(byteFragment.Buffer, byteFragment.Offset, byteFragment.Count, SocketFlags.None,
                                                 ref endPoint, result => {
                        EndPoint remoteEndPoint = new IPEndPoint(
                            endPoint.AddressFamily == AddressFamily.InterNetwork
                                    ? IPAddress.Any
                                    : IPAddress.IPv6Any,
                            0);

                        var bytesReceived = 0;
                        try {
                            lock (_receiveLock) {
                                bytesReceived = _readSocket.EndReceiveFrom(result, ref remoteEndPoint);
                            }
                        } catch (SocketException e) {
                            socketService?.OnError(e.ToString());
                            readStream.Dispose();
                            BeginRead(socketService);
                            return;
                        } catch (ObjectDisposedException objectDisposedException) {
                            socketService?.OnError(objectDisposedException.ToString());
                            readStream.Dispose();
                            return;
                        } catch (InvalidOperationException invalidOperationException) {
                            socketService?.OnError(invalidOperationException.ToString());
                            readStream.Dispose();
                            return;
                        }
                        if (bytesReceived == 0)
                        {
                            return;
                        }

                        BeginRead(socketService);

                        var length = byteFragment.Buffer.ToValue <ushort>(byteFragment.Offset);
                        if (length == bytesReceived)
                        {
                            readStream.SetReadCount(length);
                            try {
                                OnRead(remoteEndPoint, readStream);
                            } catch (Exception e) {
                                Logger.Error(e);
                            }
                        }
                        else
                        {
                            Logger.Warn($"包数据未接收全,总长{length},接收长度{bytesReceived},自动丢弃!");
                        }

                        readStream.Dispose();
                    }, null);
                }
            } catch (SocketException e) {
                socketService?.OnError(e.ToString());
                BeginRead(socketService);
            } catch (ObjectDisposedException objectDisposedException) {
                socketService?.OnError(objectDisposedException.ToString());
            } catch (InvalidOperationException invalidOperationException) {
                socketService?.OnError(invalidOperationException.ToString());
            }
        }
Exemplo n.º 3
0
        private bool StartWrite(SocketService socketService, byte[] buffer, int offset, int count, IWriteStream writeStream,
                                bool isRecycle = false)
        {
            if (socketService == null)
            {
                Logger.Error($"{nameof(socketService)} 为 null !");
                return(false);
            }

            if (socketService.Connection.RemoteAddress == null)
            {
                Logger.Error($"远程地址不能为null!");
                return(false);
            }

            lock (_senderLock) {
                try {
                    _readSocket.BeginSendTo(buffer, offset, count, SocketFlags.None,
                                            socketService.Connection.RemoteAddress, result => {
                        var bytesSended = 0;
                        try {
                            lock (_senderLock) {
                                bytesSended = _readSocket.EndSendTo(result);
                            }
                        } catch (SocketException socketException) {
                            socketService.OnError(socketException.ToString());
                            OnDisconnect(socketService);
                        } catch (ObjectDisposedException objectDisposedException) {
                            socketService.OnError(objectDisposedException.ToString());
                            OnDisconnect(socketService);
                        } catch (InvalidOperationException invalidOperationException) {
                            socketService.OnError(invalidOperationException.ToString());
                            OnDisconnect(socketService);
                        }

                        if (bytesSended != count)
                        {
                            Logger.Warn("未完全发送完,自动丢弃!");
                        }
                        else
                        {
                            Logger.Debug($"发送{socketService.Connection.RemoteAddress}:{count}字节数据!");
                            socketService.OnWrite(true);
                        }

                        if (isRecycle)
                        {
                            writeStream.Dispose();
                        }
                    }, null);
                } catch (SocketException socketException) {
                    Logger.Error(socketException.ToString());
                    socketService.OnError(socketException.ToString());
                    OnDisconnect(socketService);
                } catch (ObjectDisposedException objectDisposedException) {
                    socketService.OnError(objectDisposedException.ToString());
                    OnDisconnect(socketService);
                } catch (InvalidOperationException invalidOperationException) {
                    socketService.OnError(invalidOperationException.ToString());
                    OnDisconnect(socketService);
                }
            }
            return(true);
        }