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