예제 #1
0
        public void TcpProxyTest()
        {
            var sender = new TcpNetworkSender("tcp://foo:1234", AddressFamily.Unspecified);
            var socket = sender.CreateSocket("foo", AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            Assert.IsType <SocketProxy>(socket);
        }
예제 #2
0
        public void TcpProxyTest()
        {
            var sender = new TcpNetworkSender("tcp://foo:1234", AddressFamily.Unspecified);
            var socket = sender.CreateSocket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            Assert.IsInstanceOfType(typeof(SocketProxy), socket);
        }
예제 #3
0
        private unsafe bool CreateSession(SocketAsyncEventArgs e)
        {
            var connArgs = (ConnectionArgs)e.UserToken;

            // We need at least 4 bytes to determine session
            if (e.BytesTransferred < 4)
            {
                e.SetBuffer(e.BytesTransferred, e.Buffer.Length - e.BytesTransferred);
                return(true);
            }

            WireFormat protocol;

            // FASTER's binary protocol family is identified by inverted size (int) field in the start of a packet
            // This results in a fourth byte value (little endian) > 127, denoting a non-ASCII wire format.
            if (e.Buffer[3] > 127)
            {
                if (e.BytesTransferred < 4 + BatchHeader.Size)
                {
                    e.SetBuffer(e.BytesTransferred, e.Buffer.Length - e.BytesTransferred);
                    return(true);
                }
                fixed(void *bh = &e.Buffer[4])
                protocol = ((BatchHeader *)bh)->Protocol;
            }
            else if (e.Buffer[0] == 71 && e.Buffer[1] == 69 && e.Buffer[2] == 84)
            {
                protocol = WireFormat.WebSocket;
            }
            else
            {
                protocol = WireFormat.ASCII;
            }

            if (!GetSessionProviders().TryGetValue(protocol, out var provider))
            {
                Console.WriteLine($"Unsupported incoming wire format {protocol}");
                DisposeConnectionSession(e);
                return(false);
            }

            INetworkSender networkSender = new TcpNetworkSender(connArgs.socket, provider.GetMaxSizeSettings);

            if (!AddSession(protocol, ref provider, networkSender, out var session))
            {
                DisposeConnectionSession(e);
                return(false);
            }
            connArgs.session = session;

            if (Disposed)
            {
                DisposeConnectionSession(e);
                return(false);
            }

            ProcessRequest(e);
            return(true);
        }