コード例 #1
0
ファイル: EncodeBuffer.cs プロジェクト: vberkaltun/BACnet
        public void Add(byte b)
        {
            if (offset < max_offset)
            {
                if (serialize_counter >= min_limit)
                {
                    buffer[offset] = b;
                }
            }
            else
            {
                if (expandable)
                {
                    Array.Resize(ref buffer, buffer.Length * 2);
                    max_offset = buffer.Length - 1;
                    if (serialize_counter >= min_limit)
                    {
                        buffer[offset] = b;
                    }
                }
                else
                {
                    result |= EncodeResult.NotEnoughBuffer;
                }
            }

            Increment();
        }
コード例 #2
0
        private void SendUpdateStatePacket(UpdateState state, User user, IPAddress brdIp)
        {
            UdpPacket packet = new UdpPacket();

            packet.Address = user.Address;
            packet.Port    = user.Port;
            packet.ToMAC   = "";
            packet.FromMAC = user.ID;
            packet.Command = UdpPacket.CMD_STATE;

            UdpPacketUserStateExtend entryExtend = new UdpPacketUserStateExtend();

            entryExtend.User        = user;
            entryExtend.UpdateState = state;

            packet.Extend = entryExtend;

            UdpPacket packetWrap = new UdpPacket();

            packetWrap.Address = brdIp;
            packetWrap.Port    = this.Port;
            packetWrap.ToMAC   = "";
            packetWrap.FromMAC = this.MAC;
            packetWrap.Command = UdpPacket.CMD_RETRANSMIT;

            IPacketEncoder encoder = PacketEncoderFactory.CreateEncoder(packet);
            EncodeResult   result  = encoder.Encode();

            UdpPacketRetransExtend extend = new UdpPacketRetransExtend(result.Fragments[0]);

            packetWrap.Extend = extend;

            _client.Send(packetWrap);
        }
コード例 #3
0
        public EncodeResultViewModel(EncodeResult result, EncodeJobViewModel job)
        {
            this.encodeResult = result;
            this.job          = job;

            Messenger.Default.Register <ScanningChangedMessage>(
                this,
                message =>
            {
                this.EditCommand.RaiseCanExecuteChanged();
            });
        }
コード例 #4
0
        private static EncodeResult CreateEncodeResultFromContext(MessagingContext context)
        {
            using (var stream = new MemoryStream())
            {
                var serializer = SerializerProvider.Default.Get(context.AS4Message.ContentType);

                serializer.Serialize(context.AS4Message, stream);

                var result = new EncodeResult
                {
                    SendToUrl     = context.SendingPMode?.PushConfiguration?.Protocol?.Url,
                    AS4Message    = stream.ToArray(),
                    ContentType   = context.AS4Message.ContentType.Replace("\"utf-8\"", "utf-8"),
                    EbmsMessageId = context.AS4Message.GetPrimaryMessageId()
                };

                return(result);
            }
        }
コード例 #5
0
        public EncodeResult Encode(Buffer bytes, out Buffer encodedBytes)
        {
            Buffer       encoded;
            EncodeResult result = this.Protocol.Encode(this.ConnectionToken, bytes, out encoded);

            if (result != EncodeResult.Success)
            {
                encodedBytes = null;
                return(result);
            }

            if (this.LowerProtocol == null)
            {
                encodedBytes = encoded;
                return(EncodeResult.Success);
            }

            return(this.LowerProtocol.Encode(encoded, out encodedBytes));
        }
コード例 #6
0
        public override async Task <bool> DoWork()
        {
            using IServiceScope scope = _scopeFactory.CreateScope();
            IVideoManagerService videoService = scope.ServiceProvider.GetRequiredService <IVideoManagerService>();
            List <Video>         videos       = await videoService.GetVideosToEncode(_maxConcurrentTasks);

            if (videos.Count == 0)
            {
                return(false);
            }

            VideoManagerDbContext videoManagerDbContext = scope.ServiceProvider.GetRequiredService <VideoManagerDbContext>();
            IEncoder encodingService = scope.ServiceProvider.GetRequiredService <IEncoder>();
            List <Task <EncodeResult> > encodingTasks = new(videos.Count);

            foreach (Video video in videos)
            {
                encodingTasks.Add(encodingService.Encode(video));
                video.Status = VideoStatus.Encoding;
            }

            await videoManagerDbContext.SaveChangesAsync();

            for (int i = 0; i < encodingTasks.Count; i++)
            {
                Video video = videos[i];

                EncodeResult encodeResult = await encodingTasks[i];

                video.Status = encodeResult.Success
                    ? VideoStatus.Ready
                    : VideoStatus.Failed;

                video.EncodeTime    = encodeResult.EncodeTime;
                video.EncodedLength = encodeResult.EncodedFileLength;
            }

            await videoManagerDbContext.SaveChangesAsync();

            return(true);
        }
コード例 #7
0
        public EncodeResultViewModel(EncodeResult result, EncodeJobViewModel job)
        {
            this.encodeResult = result;
            this.job          = job;

            this.Play = ReactiveCommand.Create();
            this.Play.Subscribe(_ => this.PlayImpl());

            this.OpenContainingFolder = ReactiveCommand.Create();
            this.OpenContainingFolder.Subscribe(_ => this.OpenContainingFolderImpl());

            this.Edit = ReactiveCommand.Create(this.WhenAnyValue(x => x.MainViewModel.VideoSourceState, videoSourceState =>
            {
                return(videoSourceState != VideoSourceState.Scanning);
            }));
            this.Edit.Subscribe(_ => this.EditImpl());

            this.OpenLog = ReactiveCommand.Create();
            this.OpenLog.Subscribe(_ => this.OpenLogImpl());

            this.CopyLog = ReactiveCommand.Create();
            this.CopyLog.Subscribe(_ => this.CopyLogImpl());
        }
コード例 #8
0
ファイル: EncodeBuffer.cs プロジェクト: vberkaltun/BACnet
 public void Reset(int newOffset)
 {
     offset            = newOffset;
     serialize_counter = 0;
     result            = EncodeResult.Good;
 }
コード例 #9
0
 public void Reset(int offset)
 {
     this.offset       = offset;
     serialize_counter = 0;
     result            = EncodeResult.Good;
 }
コード例 #10
0
 public EncodeResultViewModel(EncodeResult result, EncodeJobViewModel job)
 {
     this.encodeResult = result;
     this.job          = job;
 }
コード例 #11
0
        public void Receive(TransportFile file)
        {
            TaskFactory taskFactory = new TaskFactory();

            taskFactory.StartNew(() =>
            {
                LoggerFactory.Debug("start receive file:id={0}", file.ID);
                string tmpPath = file.SavePath + "." + Path.GetRandomFileName().Replace(".", "") + ".lamim";
                FileStream fs  = null;
                try
                {
                    fs = new FileStream(tmpPath, FileMode.Create);
                }
                catch (Exception e)
                {
                    OnError(Errors.FileOpenError, "打开文件失败:" + tmpPath, file, e);
                    return;
                }
                LoggerFactory.Debug("opened file:" + tmpPath);

                LoggerFactory.Debug("try connect remote:remote={0}, port={1}", file.Remote, file.Port);
                TcpClient tcpClient = null;
                NetworkStream ns    = null;
                try
                {
                    tcpClient = new TcpClient(AddressFamily.InterNetwork)
                    {
                        ReceiveBufferSize = this.ReceiveBufferSize
                    };

                    tcpClient.Connect(file.Remote, file.Port);

                    ns = tcpClient.GetStream();
                }
                catch (Exception e)
                {
                    OnError(Errors.NetworkError, "连接失败", file, e);
                    return;
                }
                LoggerFactory.Debug("conneted remote:remote={0}, port={1}", file.Remote, file.Port);

                LoggerFactory.Debug("encode packet, request file:id={0}", file.ID);
                TcpPacket packet    = null;
                EncodeResult result = null;
                try
                {
                    //发送要接受的文件ID
                    TcpPacketRequestFileTransportExtend extend = new TcpPacketRequestFileTransportExtend
                    {
                        EncryptKey = file.PublicKey,
                        FileID     = file.ID
                    };

                    packet = new TcpPacket
                    {
                        Command = TcpPacket.CMD_REQUEST_FILE_TRANSPORT,
                        Extend  = extend
                    };

                    IPacketEncoder encoder = PacketEncoderFactory.CreateEncoder(packet);
                    result = encoder.Encode(null);
                }
                catch (Exception e)
                {
                    OnError(Errors.EncodeError, "请求文件ID包加密失败。" + packet.ToString(), file, e);
                    return;
                }

                LoggerFactory.Debug("send packet, request file:id={0}", file.ID);
                try
                {
                    ns.Write(result.Fragments[0], 0, result.Fragments[0].Length);
                }
                catch (Exception e)
                {
                    OnError(Errors.NetworkError, "请求文件ID包发送失败", file, e);
                    return;
                }

                LoggerFactory.Debug("receive file start:id={0}", file.ID);
                try
                {
                    int len = 0;
                    file.StartTransport();
                    long lastProgressTicks = file.NowTransportTicks;

                    byte[] buff = new byte[this.ReceiveBufferSize];
                    while ((len = ns.Read(buff, 0, buff.Length)) != 0)
                    {
                        fs.Write(buff, 0, len);

                        file.Transported(len);

                        if (file.TransportedLength == file.File.Length ||
                            (DateTime.Now.Ticks - lastProgressTicks) > this._progressChangeInterval) //避免进度太频繁,500ms一次
                        {
                            OnProgressChanged(file);
                            lastProgressTicks = file.NowTransportTicks;
                        }
                    }
                    LoggerFactory.Debug("receive file end:id={0}", file.ID);
                }
                catch (Exception e)
                {
                    OnError(Errors.NetworkError, "文件接收失败", file, e);
                }
                finally
                {
                    LoggerFactory.Debug("close connect and save file:id={0}", file.ID);
                    //关闭连接
                    ns.Close();
                    tcpClient.Close();

                    fs.Flush(true);
                    fs.Close();

                    if (LanFile.Rename(tmpPath, file.SavePath))
                    {
                        //发送接收完毕
                        OnCompleted(file);
                    }
                    else
                    {
                        OnError(Errors.FileWriteError, "文件写入失败", file, null);
                    }
                }
                LoggerFactory.Debug("end receive file:id={0}", file.ID);
            });
        }
コード例 #12
0
ファイル: UdpClientEx.cs プロジェクト: prape/LanIM
        public void Send(UdpPacket packet)
        {
            if (this._state != ClientState.Working)
            {
                return;
            }

            //异步发送
            IPEndPoint remoteIpEp = new IPEndPoint(packet.Address, packet.Port);

            packet.GenerateID();

            LoggerFactory.Debug("parepare send packet:{0}", packet);

            EncodeResult result = null;

            try
            {
                IPacketEncoder encoder = PacketEncoderFactory.CreateEncoder(packet);
                LoggerFactory.Debug("get encoder:{0}", encoder.GetType().Name);

                result = encoder.Encode(null);
                LoggerFactory.Debug("encode packet:{0}", result);

                if (result.Length > UDP_MAX_BUF_SIZE)
                {
                    //超过大小的分包处理
                    MultiUdpPacket mpacket = new MultiUdpPacket(result.Fragments[0]);
                    mpacket.ID       = packet.ID;
                    mpacket.ParentID = packet.ID;

                    encoder = PacketEncoderFactory.CreateEncoder(mpacket);
                    LoggerFactory.Debug("get encoder:{0}", encoder.GetType().Name);

                    result = encoder.Encode(UDP_MAX_BUF_SIZE - MultiUdpPacket.HEAD_SIZE);
                    LoggerFactory.Debug("encode packet:{0}", result);
                }
            }
            catch (Exception e)
            {
                OnSendPackage(packet, false);
                OnError(Errors.EncodeError, "加密包错误。", e);
            }

            try
            {
                for (int i = 0; i < result.Fragments.Count; i++)
                {
                    byte[]    buf   = result.Fragments[i];
                    SendState state = new SendState();
                    state.LastPacket = i == result.Fragments.Count - 1;
                    state.Packet     = packet;
                    _client.BeginSend(buf, buf.Length, remoteIpEp, new AsyncCallback(AsyncSendHandler), state);
                    Thread.Sleep(20);//稍微等待一下,避免丢包
                }
            }
            catch (Exception e)
            {
                OnSendPackage(packet, false);
                OnError(Errors.NetworkError, "发送包错误。", e);
            }
        }