Esempio n. 1
0
        public static byte Parse(
            Level lvl,
            SegmentOffset segOff)
        {
            Material mat = Material.Default;

            return(Parse(lvl, ref mat, segOff));
        }
Esempio n. 2
0
        /// <summary>
        /// 根据偏移发送缓冲区数据
        /// </summary>
        /// <param name="sendSegment"></param>
        /// <param name="waiting"></param>
        public bool Send(SegmentOffset sendSegment, bool waiting = true)
        {
            try
            {
                if (IsClose())
                {
                    Close();
                    return(false);
                }

                var segItems    = _sBufferManager.BufferToSegments(sendSegment.Buffer, sendSegment.Offset, sendSegment.Size);
                var isWillEvent = true;

                foreach (var seg in segItems)
                {
                    var tArgs = GetSocketAsyncFromSendPool(waiting);
                    if (tArgs == null)
                    {
                        return(false);
                    }
                    if (!_sBufferManager.WriteBuffer(tArgs, seg.Array, seg.Offset, seg.Count))
                    {
                        _sendTokenManager.Set(tArgs);

                        throw new Exception(string.Format("发送缓冲区溢出...buffer block max size:{0}", _sBufferManager.BlockSize));
                    }
                    if (tArgs.UserToken == null)
                    {
                        ((SocketToken)tArgs.UserToken).TokenSocket = socket;
                    }

                    if (IsClose())
                    {
                        Close();
                        return(false);
                    }

                    isWillEvent &= socket.SendAsync(tArgs);
                    if (!isWillEvent)//can't trigger the io complated event to do
                    {
                        ProcessSentCallback(tArgs);
                    }

                    if (_sendTokenManager.Count < (_sendTokenManager.Capacity >> 2))
                    {
                        Thread.Sleep(2);
                    }
                }

                return(isWillEvent);
            }
            catch (Exception)
            {
                Close();

                throw;
            }
        }
Esempio n. 3
0
        public SegmentOffset ToSegmentFrame(SegmentOffset data, OpCodeType code = OpCodeType.Text)
        {
            OpCode = (byte)code;

            Payload       = data;
            PayloadLength = Payload.buffer.LongLength;

            return(new SegmentOffset(EncodingToBytes()));
        }
        public bool Send(SegmentOffset data, bool waiting = true)
        {
            if (IsConnected == false)
            {
                return(false);
            }

            clientProvider.Send(data, waiting);
            return(true);
        }
Esempio n. 5
0
        public static GeoRoot Parse(
            Model3D mdl,
            Level lvl,
#if !NO_LEVEL_MAT
            ref Material material,
#endif
            SegmentOffset segOff)
        {
            var root = new GeoRoot(mdl);
            var rt   = new Runtime(lvl, mdl, root)
#if !NO_GEO_MAT && !NO_LEVEL_MAT
            {
                material = material,
            }
#elif !NO_GEO_MAT
            { material = Material.Default, }
#endif
            ;

            Runtime.SetSegment(rt, segOff);
            root.Code = Runtime.Evaluate(rt);
            var endingNode = rt.nodeCurrent;

#if DEBUG
            rt.log.AppendLine("End parse:" + (null == endingNode?"null":endingNode.Depth.ToString()));

            {
                for (int i = 0; i < 256; i++)
                {
                    if (rt.counter[i] != 0)
                    {
                        rt.log.AppendLine(i.ToString("X2") + ":" + rt.counter[i]);
                    }
                }
                rt.log.AppendLine(rt.counter[256].ToString());
            }
#endif
            root.Bind();
#if !NO_GEO_MAT
            material = rt.material;
#endif
#if DEBUG
            if (rt.nodeCurrent != null)
            {
                rt.log.AppendLine("!+" + (1u + rt.nodeCurrent.Depth));
                System.Console.WriteLine(rt.log);
            }
            else if (rt.counter[256] != 0)
            {
                System.Console.WriteLine(rt.log);
            }
#endif

            return(mdl.root = root);
        }
Esempio n. 6
0
        public static GeoRoot Parse(Area area,
#if !NO_LEVEL_MAT
                                    ref Material material,
#endif
                                    SegmentOffset segOff)
        {
            return(Parse(area.AreaModel, area.level,
#if !NO_LEVEL_MAT
                         ref material,
#endif
                         segOff));
        }
Esempio n. 7
0
        public SegmentOffset ToSegmentFrame(string content)
        {
            var buf = encoding.GetBytes(content);

            Payload = new SegmentOffset()
            {
                buffer = buf
            };

            PayloadLength = Payload.buffer.LongLength;

            return(new SegmentOffset(EncodingToBytes()));
        }
Esempio n. 8
0
        public AccessInfo GetHandshakePackage(SegmentOffset segOffset)
        {
            string msg = encoding.GetString(segOffset.buffer, segOffset.offset, segOffset.size);

            string[] items = msg.Split(BaseInfo.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
            if (items.Length < 6)
            {
                throw new Exception("access format error..." + msg);
            }

            AccessInfo access = new AccessInfo()
            {
                HttpProto = items[0]
            };

            foreach (var item in items)
            {
                string[] kv = item.Split(splitChars, StringSplitOptions.RemoveEmptyEntries);
                switch (kv[0])
                {
                case "Connection":
                    access.Connection = kv[1];
                    break;

                case "Host":
                    access.Host = kv[1];
                    break;

                case "Origin":
                    access.Origin = kv[1];
                    break;

                case "Upgrade":
                    access.Upgrade = kv[1];
                    break;

                case "Sec-WebSocket-Key":
                    access.SecWebSocketKey = kv[1];
                    break;

                case "Sec-WebSocket-Version":
                    access.SecWebSocketVersion = kv[1];
                    break;

                case "Sec-WebSocket-Extensions":
                    access.SecWebSocketExtensions = kv[1];
                    break;
                }
            }
            return(access);
        }
Esempio n. 9
0
        /// <summary>
        /// 同步发送
        /// </summary>
        /// <param name="sendSegment"></param>
        /// <param name="receiveSegment"></param>
        /// <returns></returns>
        public int SendSync(SegmentOffset sendSegment, SegmentOffset receiveSegment)
        {
            var sent = Socket.SendTo(sendSegment.Buffer, sendSegment.Offset, sendSegment.Size, 0, IpEndPoint);

            if (receiveSegment?.Buffer == null || receiveSegment.Size == 0)
            {
                return(sent);
            }

            Socket.ReceiveFrom(receiveSegment.Buffer,
                               receiveSegment.Size,
                               SocketFlags.None,
                               ref IpEndPoint);

            return(sent);
        }
Esempio n. 10
0
        /// <summary>
        /// 同步接收
        /// </summary>
        /// <param name="receiveSegment"></param>
        /// <param name="receiveAction"></param>
        public void ReceiveSync(SegmentOffset receiveSegment, Action <SegmentOffset> receiveAction)
        {
            do
            {
                var cnt = Socket.ReceiveFrom(receiveSegment.Buffer,
                                             receiveSegment.Size,
                                             SocketFlags.None,
                                             ref IpEndPoint);

                if (cnt <= 0)
                {
                    break;
                }

                receiveAction(receiveSegment);
            } while (true);
        }
Esempio n. 11
0
        /// <summary>
        /// 同步发送
        /// </summary>
        /// <param name="buffer"></param>
        /// <param name="recAct"></param>
        /// <param name="recBufferSize"></param>
        /// <returns></returns>
        public int SendSync(SegmentOffset sendSegment, SegmentOffset receiveSegment)
        {
            int sent = socket.SendTo(sendSegment.buffer, sendSegment.offset, sendSegment.size, 0, ipEndPoint);

            if (receiveSegment == null ||
                receiveSegment.buffer == null ||
                receiveSegment.size == 0)
            {
                return(sent);
            }

            int cnt = socket.ReceiveFrom(receiveSegment.buffer,
                                         receiveSegment.size,
                                         SocketFlags.None,
                                         ref ipEndPoint);

            return(sent);
        }
Esempio n. 12
0
        /// <summary>
        /// 同步发送数据
        /// </summary>
        /// <param name="sendSegment"></param>
        /// <param name="receiveSegment"></param>
        /// <returns></returns>
        public int SendSync(SegmentOffset sendSegment, SegmentOffset receiveSegment)
        {
            if (_channelProviderState != ChannelProviderType.Sync)
            {
                throw new Exception("需要使用同步连接...ConnectSync");
            }

            var sent = socket.Send(sendSegment.Buffer, sendSegment.Offset, sendSegment.Size, SocketFlags.None);

            if (receiveSegment?.Buffer == null || receiveSegment.Size == 0)
            {
                return(sent);
            }

            socket.Receive(receiveSegment.Buffer, receiveSegment.Size, 0);

            return(sent);
        }
Esempio n. 13
0
        public HttpPayload GetDo(SegmentToken sToken)
        {
            var paylaod = new HttpPayload()
            {
                Header  = header,
                HttpUri = new HttpUri(header.RelativeUri),
                Token   = sToken.sToken
            };

            if (header.ContentLength > 0)
            {
                SegmentOffset seg = sToken.Data;
                paylaod.stream = new MemoryStream(seg.buffer,
                                                  seg.offset + (int)header.StreamPosition,
                                                  (int)header.ContentLength);
            }
            return(paylaod);
        }
Esempio n. 14
0
        /// <summary>
        /// 同步接收
        /// </summary>
        /// <param name="recAct"></param>
        /// <param name="recBufferSize"></param>
        public void ReceiveSync(SegmentOffset receiveSegment, Action <SegmentOffset> receiveAction)
        {
            int cnt = 0;

            do
            {
                cnt = socket.ReceiveFrom(receiveSegment.buffer,
                                         receiveSegment.size,
                                         SocketFlags.None,
                                         ref ipEndPoint);

                if (cnt <= 0)
                {
                    break;
                }

                receiveAction(receiveSegment);
            } while (true);
        }
Esempio n. 15
0
        public bool Send(SegmentOffset sendSegment, bool waiting = true)
        {
            try
            {
                bool isWillEvent = true;
                ArraySegment <byte>[] segItems = sendBufferManager.BufferToSegments(sendSegment.buffer, sendSegment.offset, sendSegment.size);
                foreach (var seg in segItems)
                {
                    SocketAsyncEventArgs tArgs = sendTokenManager.GetEmptyWait((retry) =>
                    {
                        return(true);
                    }, waiting);

                    if (tArgs == null)
                    {
                        throw new Exception("发送缓冲池已用完,等待回收...");
                    }

                    tArgs.RemoteEndPoint = ipEndPoint;

                    if (!sendBufferManager.WriteBuffer(tArgs, seg.Array, seg.Offset, seg.Count))
                    {
                        sendTokenManager.Set(tArgs);

                        throw new Exception(string.Format("发送缓冲区溢出...buffer block max size:{0}", sendBufferManager.BlockSize));
                    }

                    isWillEvent &= socket.SendToAsync(tArgs);
                    if (!isWillEvent)
                    {
                        ProcessSent(tArgs);
                    }
                }
                return(isWillEvent);
            }
            catch (Exception ex)
            {
                Close();

                throw ex;
            }
        }
Esempio n. 16
0
        public static byte Parse(
            Level lvl,
#if !NO_LEVEL_MAT
            ref Material material,
#endif
            SegmentOffset segOff)
        {
            var rt = new Runtime(lvl)
#if !NO_LEVEL_MAT
            {
                material = material,
            }
#endif
            ;

            Runtime.SetSegment(rt, segOff);
            var ret = Runtime.Evaluate(rt);

            return(ret);
        }
Esempio n. 17
0
        public HttpHeader(SegmentOffset segment)
        {
            using (MemoryStream ms = new MemoryStream(segment.buffer, segment.offset, segment.size))
                using (StreamReader reader = new StreamReader(ms, Encoding.UTF8))
                {
                    string line = reader.ReadLine();// first line
                    GetHeaderLine(line);

                    while ((line = reader.ReadLine()) != null)
                    {
                        if (line == string.Empty)
                        {
                            ContentLength  = ms.Length - ms.Position;
                            StreamPosition = ms.Position;
                            break;
                        }
                        GetHeader(line);
                    }
                }
        }
Esempio n. 18
0
        public bool Send(SegmentOffset sendSegment, bool waiting = true)
        {
            try
            {
                var isWillEvent = true;
                var segItems    = _sendBufferManager.BufferToSegments(sendSegment.Buffer, sendSegment.Offset, sendSegment.Size);
                foreach (var seg in segItems)
                {
                    var tArgs = _sendTokenManager.GetEmptyWait((retry) => true, waiting);

                    if (tArgs == null)
                    {
                        throw new Exception("发送缓冲池已用完,等待回收...");
                    }

                    tArgs.RemoteEndPoint = IpEndPoint;

                    if (!_sendBufferManager.WriteBuffer(tArgs, seg.Array, seg.Offset, seg.Count))
                    {
                        _sendTokenManager.Set(tArgs);

                        throw new Exception(string.Format("发送缓冲区溢出...buffer block max size:{0}", _sendBufferManager.BlockSize));
                    }

                    isWillEvent &= Socket.SendToAsync(tArgs);
                    if (!isWillEvent)
                    {
                        ProcessSent(tArgs);
                    }
                }
                return(isWillEvent);
            }
            catch (Exception)
            {
                Close();

                throw;
            }
        }
Esempio n. 19
0
        /// <summary>
        /// 发送数据
        /// </summary>
        /// <param name="dataSegment"></param>
        /// <param name="remoteEp"></param>
        /// <param name="waiting"></param>
        public bool Send(SegmentOffset dataSegment, IPEndPoint remoteEp, bool waiting)
        {
            var isWillEvent = true;

            var segItems = _sendBufferManager.BufferToSegments(dataSegment.Buffer, dataSegment.Offset, dataSegment.Size);

            foreach (var seg in segItems)
            {
                var tArgs = _sendTokenManager.GetEmptyWait(retry => true, waiting);

                if (tArgs == null)
                {
                    throw new Exception("发送缓冲池已用完,等待回收超时...");
                }

                tArgs.RemoteEndPoint = remoteEp;
                var s = SocketVersion(remoteEp);
                tArgs.UserToken = s;

                if (!_sendBufferManager.WriteBuffer(tArgs, seg.Array, seg.Offset, seg.Count))
                {
                    _sendTokenManager.Set(tArgs);

                    throw new Exception(string.Format("发送缓冲区溢出...buffer block max size:{0}", _sendBufferManager.BlockSize));
                }

                if (tArgs.RemoteEndPoint != null)
                {
                    isWillEvent &= s.SendToAsync(tArgs);
                    if (!isWillEvent)
                    {
                        ProcessSent(tArgs);
                    }
                }
                Thread.Sleep(5);
            }
            return(isWillEvent);
        }
Esempio n. 20
0
        /// <summary>
        /// 同步接收数据
        /// </summary>
        /// <param name="receiveSegment"></param>
        /// <param name="receivedAction"></param>
        public void ReceiveSync(SegmentOffset receiveSegment, Action <SegmentOffset> receivedAction)
        {
            if (_channelProviderState != ChannelProviderType.Sync)
            {
                throw new Exception("需要使用同步连接...ConnectSync");
            }

            do
            {
                if (socket.Connected == false)
                {
                    break;
                }

                var cnt = socket.Receive(receiveSegment.Buffer, receiveSegment.Size, 0);
                if (cnt <= 0)
                {
                    break;
                }

                receivedAction(receiveSegment);
            } while (true);
        }
Esempio n. 21
0
 public SegmentToken(SocketToken sToken, byte[] buffer, int offset, int size)
 {
     this.sToken = sToken;
     this.Data   = new SegmentOffset(buffer, offset, size);
 }
Esempio n. 22
0
 public static void GetSegmentOffset(
     Runtime rt,
     out SegmentOffset segmentOffset)
 {
     segmentOffset = rt.segmentOffset;
 }
Esempio n. 23
0
 public static void SetSegment(Runtime rt, SegmentOffset Segment)
 {
     rt.segmentOffset.Offset = Segment.Offset;
     SetSegment(rt, Segment.Segment);
 }
Esempio n. 24
0
 public Runtime(Runtime copy, SegmentOffset segOff) : this(copy)
 {
     SetSegment(this, segOff);
 }
 public bool Send(SegmentOffset dataSegment, IPEndPoint remoteEP, bool waiting = true)
 {
     return(socketSend.Send(dataSegment, remoteEP, waiting));
 }
Esempio n. 26
0
 public int Send(SegmentOffset dataSegment)
 {
     return(TokenSocket.Send(dataSegment.Buffer,
                             dataSegment.Offset,
                             dataSegment.Size, 0));
 }
Esempio n. 27
0
 public SegmentToken(SocketToken sToken, byte[] buffer)
 {
     this.sToken = sToken;
     this.Data   = new SegmentOffset(buffer);
 }
 public int SendSync(IPEndPoint remoteEP, SegmentOffset dataSegment)
 {
     return(socketSend.SendSync(dataSegment, remoteEP));
 }
Esempio n. 29
0
 /// <summary>
 /// 同步发送数据
 /// </summary>
 /// <param name="dataSegment"></param>
 /// <param name="remoteEp"></param>
 /// <returns></returns>
 public int SendSync(SegmentOffset dataSegment, IPEndPoint remoteEp)
 {
     return(SocketVersion(remoteEp).SendTo(dataSegment.Buffer, dataSegment.Offset, dataSegment.Size,
                                           SocketFlags.None, remoteEp));
 }
Esempio n. 30
0
 public SegmentToken(SocketToken sToken, SegmentOffset data)
 {
     this.sToken = sToken;
     this.Data   = data;
 }