/// <summary>
        /// response for game status
        /// </summary>
        /// <param name="body"></param>
        /// <param name="gameid"></param>
        /// <param name="brief"></param>
        private void GetGameStatus(string body, string gameid, string brief)
        {
            HttpStatusCode httpStatus;
            GameInfo       game;

            if (brief.Equals("yes"))
            {
                game = service.GetGameStatus(gameid, "yes", out httpStatus);
            }
            else
            {
                game = service.GetGameStatus(gameid, "no", out httpStatus);
            }


            string res = ("HTTP/1.1 " + (int)httpStatus + " " + httpStatus + "\r\n");

            if ((int)httpStatus / 100 == 2)
            {
                string result = JsonConvert.SerializeObject(game);
                res += ("Content-Type: application/json\r\n");
                res += ("Content-Length: " + Encoding.UTF8.GetByteCount(result) + "\r\n");
                res += "\r\n";
                res += result;
            }
            else
            {
                res += "\r\n";
            }

            socket.BeginSend(res, (x, y) => { socket.Shutdown(SocketShutdown.Both); }, null);
        }
            public void run(int port)
            {
                int         LIMIT = 1000;
                int         count = LIMIT;
                Socket      s1, s2;
                TcpListener server;

                OpenSockets(port, out server, out s1, out s2);
                List <int> lines = new List <int>();

                for (int i = 0; i < LIMIT; i++)
                {
                    lines.Add(-1);
                }
                StringSocket receiver = null;
                SS           sender   = null;

                try
                {
                    sender   = new SS(s1, new UTF8Encoding());
                    receiver = new StringSocket(s2, new UTF8Encoding());
                    for (int i = 0; i < LIMIT / 4; i++)
                    {
                        int j = i;
                        receiver.BeginReceive((s, e, p) => { lock (lines) { lines[j] = Int32.Parse(s); } Interlocked.Decrement(ref count); }, null);
                    }
                    for (int i = 0; i < LIMIT / 2; i++)
                    {
                        sender.BeginSend(i.ToString() + "\n", (e, p) => { }, null);
                    }
                    for (int i = LIMIT / 4; i < 3 * LIMIT / 4; i++)
                    {
                        int j = i;
                        receiver.BeginReceive((s, e, p) => { lock (lines) { lines[j] = Int32.Parse(s); } Interlocked.Decrement(ref count); }, null);
                    }
                    for (int i = LIMIT / 2; i < LIMIT; i++)
                    {
                        sender.BeginSend(i.ToString() + "\n", (e, p) => { }, null);
                    }
                    for (int i = 3 * LIMIT / 4; i < LIMIT; i++)
                    {
                        int j = i;
                        receiver.BeginReceive((s, e, p) => { lock (lines) { lines[j] = Int32.Parse(s); } Interlocked.Decrement(ref count); }, null);
                    }

                    if (!SpinWait.SpinUntil(() => count == 0, 5000))
                    {
                        Assert.Fail();
                    }
                    for (int i = 0; i < LIMIT; i++)
                    {
                        Assert.AreEqual(i, lines[i]);
                    }
                }
                finally
                {
                    CloseSockets(server, receiver, sender);
                }
            }
Beispiel #3
0
            private void CreateUserRequest(string line)
            {
                // Check
                Name   n      = JsonConvert.DeserializeObject <Name>(line);
                User   u      = new User(n);
                User   user   = new BoggleService().CreateUser(u, out HttpStatusCode status);
                string result = CreateResult(user, status);

                ss.BeginSend(result, (x, y) => { ss.Shutdown(System.Net.Sockets.SocketShutdown.Both); }, null);
            }
            public void run(int port)
            {
                Socket      s1, s2;
                TcpListener server;

                OpenSockets(port, out server, out s1, out s2);
                String           line = "";
                ManualResetEvent mre  = new ManualResetEvent(false);
                SS           sender   = null;
                StringSocket receiver = null;

                try
                {
                    sender   = new SS(s1, new UTF8Encoding());
                    receiver = new StringSocket(s2, new UTF8Encoding());
                    sender.BeginSend("Hello\n", (e, p) => { }, null);
                    receiver.BeginReceive((s, e, p) => { line = s; mre.Set(); }, null);
                    mre.WaitOne();
                    Assert.AreEqual("Hello", line);
                }
                finally
                {
                    CloseSockets(server, receiver, sender);
                }
            }
            public void run(int port)
            {
                Socket      s1, s2;
                TcpListener server;

                OpenSockets(port, out server, out s1, out s2);
                String           line     = "";
                ManualResetEvent mre      = new ManualResetEvent(false);
                StringSocket     receiver = null;
                SS sender = null;

                try
                {
                    sender   = new SS(s1, new UTF8Encoding());
                    receiver = new StringSocket(s2, new UTF8Encoding());
                    StringBuilder text = new StringBuilder();
                    for (int i = 0; i < 100000; i++)
                    {
                        text.Append(i);
                    }
                    String str = text.ToString();
                    text.Append('\n');
                    sender.BeginSend(text.ToString(), (e, p) => { }, null);
                    receiver.BeginReceive((s, e, p) => { line = s; mre.Set(); }, null);
                    mre.WaitOne();
                    Assert.AreEqual(str, line);
                }
                finally
                {
                    CloseSockets(server, receiver, sender);
                }
            }
            public void run(int port)
            {
                Socket      s1, s2;
                TcpListener server;

                OpenSockets(port, out server, out s1, out s2);
                StringSocket receiver = null;
                SS           sender   = null;
                int          LIMIT    = 2;

                try
                {
                    sender   = new SS(s1, new UTF8Encoding());
                    receiver = new StringSocket(s2, new UTF8Encoding());
                    int count = LIMIT;

                    for (int i = 0; i < LIMIT; i++)
                    {
                        sender.BeginSend("Hello\n", (e, p) => { }, null);
                    }

                    for (int i = 0; i < LIMIT; i++)
                    {
                        Task.Run(
                            () => receiver.BeginReceive((s, e, p) => { Interlocked.Decrement(ref count); while (true)
                                                                       {
                                                                           ;
                                                                       }
                                                        }, null));
                    }
                    if (!SpinWait.SpinUntil(() => count == 0, 5000))
                    {
                        Assert.Fail();
                    }
                }
                finally
                {
                    CloseSockets(server, receiver, sender);
                }
            }
            public void run(int port)
            {
                int         LIMIT = 1000;
                Socket      s1, s2;
                TcpListener server;

                OpenSockets(port, out server, out s1, out s2);
                List <int>   lines    = new List <int>();
                StringSocket receiver = null;
                SS           sender   = null;

                try
                {
                    sender   = new SS(s1, new UTF8Encoding());
                    receiver = new StringSocket(s2, new UTF8Encoding());
                    for (int i = 0; i < LIMIT; i++)
                    {
                        ThreadPool.QueueUserWorkItem(x =>
                                                     receiver.BeginReceive((s, e, p) => { lock (lines) { lines.Add(Int32.Parse(s)); } }, null));
                    }
                    for (int i = 0; i < LIMIT; i++)
                    {
                        sender.BeginSend(i.ToString() + "\n", (e, p) => { }, null);
                    }
                    if (!SpinWait.SpinUntil(() => { lock (lines) { return(lines.Count == LIMIT); } }, 5000))
                    {
                        Assert.Fail();
                    }

                    lines.Sort();
                    for (int i = 0; i < LIMIT; i++)
                    {
                        Assert.AreEqual(i, lines[i]);
                    }
                }
                finally
                {
                    CloseSockets(server, receiver, sender);
                }
            }
            public void run(int port)
            {
                int         LIMIT = 1000;
                Socket      s1, s2;
                TcpListener server;

                OpenSockets(port, out server, out s1, out s2);
                String[]         lines = new String[LIMIT];
                ManualResetEvent mre   = new ManualResetEvent(false);
                int          count     = 0;
                StringSocket receiver  = null;
                SS           sender    = null;

                try
                {
                    sender   = new SS(s1, new UTF8Encoding());
                    receiver = new StringSocket(s2, new UTF8Encoding());
                    for (int i = 0; i < LIMIT; i++)
                    {
                        receiver.BeginReceive((s, e, p) => { lines[(int)p] = s; Interlocked.Increment(ref count); }, i);
                    }
                    for (int i = 0; i < LIMIT; i++)
                    {
                        sender.BeginSend(i.ToString() + "\n", (e, p) => { }, null);
                    }
                    if (!SpinWait.SpinUntil(() => count == LIMIT, 5000))
                    {
                        Assert.Fail();
                    }
                    for (int i = 0; i < LIMIT; i++)
                    {
                        Assert.AreEqual(i.ToString(), lines[i]);
                    }
                }
                finally
                {
                    CloseSockets(server, receiver, sender);
                }
            }
        /// <summary>
        /// Handles the request after all relevant info has been parsed out
        /// </summary>
        /// <param name="line"></param>
        /// <param name="p"></param>
        private void ProcessRequest(string line, object p = null)
        {
            String result = "";

            // this handles 'make user' request
            if (makeUserPattern.IsMatch(firstLine))
            {
                UserNickames name = JsonConvert.DeserializeObject <UserNickames>(line);
                dynamic      user = new BoggleService().Register(name, out HttpStatusCode status);
                result = ComposeResponse(user, status);
            }
            // this handles 'join game' request
            else if (joinGamePattern.IsMatch(firstLine))
            {
                GameRequest  request  = JsonConvert.DeserializeObject <GameRequest>(line);
                JoinResponse response = new BoggleService().Join(request, out HttpStatusCode status);
                result = ComposeResponse(response, status);
            }
            // this handles 'update game status' with brief parameter on or off
            else if (updateNoBriefPattern.IsMatch(firstLine) || updateBriefPattern.IsMatch(firstLine))
            {
                Match  m;
                string gameID     = "";
                string briefParam = null;
                string brief      = "";

                // if brief parameter is not provided
                if (updateNoBriefPattern.Match(firstLine).Success)
                {
                    m      = updateNoBriefPattern.Match(firstLine);
                    gameID = m.Groups[1].ToString();
                }

                // or not provided, parse brief parameter
                if (updateBriefPattern.Match(firstLine).Success)
                {
                    m = updateBriefPattern.Match(firstLine);

                    // game ID is embedded in first group of regex pattern
                    gameID = m.Groups[1].ToString();

                    // brief parameter is embedded in second group of regex pattern
                    briefParam = m.Groups[2].ToString();

                    // remove irrelevent strings
                    brief = briefParam.Substring(7);
                }

                GameStatus     response;
                HttpStatusCode status;
                if (briefParam == null)
                {
                    response = new BoggleService().Update(gameID, "No", out status);
                }
                else
                {
                    response = new BoggleService().Update(gameID, brief, out status);
                }

                result = ComposeResponse(response, status);
            }
            // this handles playword request
            else if (playWordPattern.IsMatch(firstLine))
            {
                string       gameID   = playWordPattern.Match(firstLine).Groups[1].ToString();
                PlayRequest  request  = JsonConvert.DeserializeObject <PlayRequest>(line);
                PlayResponse response = new BoggleService().PlayWord(request, gameID, out HttpStatusCode status);
                result = ComposeResponse(response, status);
            }
            // this handles cancel game request
            else if (cancelPattern.IsMatch(firstLine))
            {
                UserObject user = JsonConvert.DeserializeObject <UserObject>(line);
                new BoggleService().CancelJoinRequest(user, out HttpStatusCode status);
                result = ComposeResponse(null, status);
            }
            // capturing whatever string requests that does not match any of the above regex patterns
            else
            {
                result = "HTTP/1.1 " + "403" + " Forbidden" + "\r\n\r\n";
            }
            socket.BeginSend(result, (x, y) => { socket.Shutdown(SocketShutdown.Both); }, null);
        }
Beispiel #10
0
                private void ProcessRequest(string line, object p = null)
                {
                    // Determine which service method to invoke from

                    // Handle "create user" requests
                    if (createUserPattern.IsMatch(firstLine))
                    {
                        UserInfo user = JsonConvert.DeserializeObject <UserInfo>(line);
                        user = new BoggleService().CreateUser(user, out HttpStatusCode status);
                        String result = "HTTP/1.1 " + (int)status + " " + status + "\r\n";
                        if ((int)status / 100 == 2) // status is OK
                        {
                            string res = JsonConvert.SerializeObject(user);
                            result += "Content-Length: " + Encoding.UTF8.GetByteCount(res) + "\r\n";
                            result += res;
                        }
                        result += "\r\n";
                        ss.BeginSend(result, (x, y) =>
                        {
                            ss.Dispose();
                            //ss.Shutdown(System.Net.Sockets.SocketShutdown.Both);
                        }, null);
                    }
                    // Handle "Join game" request
                    else if (joinGamePattern.IsMatch(firstLine))
                    {
                        UserInfo user   = JsonConvert.DeserializeObject <UserInfo>(line);
                        GameInfo game   = new BoggleService().JoinGame(user, out HttpStatusCode status);
                        String   result = "HTTP/1.1 " + (int)status + " " + status + "\r\n";
                        if ((int)status / 100 == 2) // status is OK
                        {
                            string res = JsonConvert.SerializeObject(game);
                            result += "Content-Length: " + Encoding.UTF8.GetByteCount(res) + "\r\n";
                            result += res;
                        }
                        result += "\r\n";

                        ss.BeginSend(result, (x, y) =>
                        {
                            ss.Dispose();
                            //ss.Shutdown(System.Net.Sockets.SocketShutdown.Both);
                        }, null);
                    }

                    // Handle Play word request
                    else if (playWordPattern.IsMatch(firstLine))
                    {
                        UserInfo user   = JsonConvert.DeserializeObject <UserInfo>(line);
                        string   gameid = "";
                        foreach (char a in firstLine)
                        {
                            if (Int32.TryParse(a.ToString(), out int IdontCare))
                            {
                                gameid += a.ToString();
                            }
                            if (a == 'H')
                            {
                                break;
                            }
                        }
                        WordPlayed wp     = new BoggleService().PlayWord(user, gameid, out HttpStatusCode status);
                        String     result = "HTTP/1.1 " + (int)status + " " + status + "\r\n";
                        if ((int)status / 100 == 2) // status is OK
                        {
                            string res = JsonConvert.SerializeObject(wp);
                            result += "Content-Length: " + Encoding.UTF8.GetByteCount(res) + "\r\n";
                            result += res;
                        }
                        result += "\r\n";
                        ss.BeginSend(result, (x, y) =>
                        {
                            ss.Dispose();
                            //ss.Shutdown(System.Net.Sockets.SocketShutdown.Both);
                        }, null);
                    }
                    // Handle cancel join request
                    else if (cancelJoinPattern.IsMatch(firstLine))
                    {
                        UserInfo user = JsonConvert.DeserializeObject <UserInfo>(line);
                        new BoggleService().CancelJoinRequest(user, out HttpStatusCode status);
                        String result = "HTTP/1.1 " + (int)status + " " + status + "\r\n";
                        result += "\r\n";
                        ss.BeginSend(result, (x, y) =>
                        {
                            ss.Dispose();
                            //ss.Shutdown(System.Net.Sockets.SocketShutdown.Both);
                        }, null);
                    }
                    // Handle game status request
                    else if (gameStatusPattern.IsMatch(firstLine))
                    {
                        string Brief      = "hgf";
                        int    briefIndex = firstLine.IndexOf("Brief");
                        if (briefIndex != -1)
                        {
                            if (firstLine.Substring(briefIndex + 6, 12) == "yes HTTP/1.1")
                            {
                                Brief = "yes";
                            }
                        }
                        string gameid = "";
                        foreach (char a in firstLine)
                        {
                            if (Int32.TryParse(a.ToString(), out int IdontCare))
                            {
                                gameid += a.ToString();
                            }
                            if (a == 'H')
                            {
                                break;
                            }
                        }
                        GameInfo gi     = new BoggleService().GameStatus(Brief, gameid, out HttpStatusCode status);
                        String   result = "HTTP/1.1 " + (int)status + " " + status + "\r\n";
                        if ((int)status / 100 == 2) // status is OK
                        {
                            string res = JsonConvert.SerializeObject(gi);
                            result += "Content-Length: " + Encoding.UTF8.GetByteCount(res) + "\r\n";
                            result += res;
                        }
                        result += "\r\n";
                        ss.BeginSend(result, (x, y) =>
                        {
                            ss.Dispose();
                            //ss.Shutdown(System.Net.Sockets.SocketShutdown.Both);
                        }, null);
                    }
                    else // handle invalid requests
                    {
                        String result = "HTTP/1.1 400 INVALID REQUEST\r\n\r\n";
                        ss.BeginSend(result, (x, y) =>
                        {
                            ss.Dispose();
                            //ss.Shutdown(System.Net.Sockets.SocketShutdown.Both);
                        }, null);
                    }
                }
Beispiel #11
0
            public void run(int port)
            {
                int LIMIT = 1000;
                Socket s1, s2;
                TcpListener server;
                OpenSockets(port, out server, out s1, out s2);
                List<int> lines = new List<int>();

                try
                {
                    SS sender = new SS(s1, new UTF8Encoding());
                    StringSocket receiver = new StringSocket(s2, new UTF8Encoding());
                    for (int i = 0; i < LIMIT; i++)
                    {
                        ThreadPool.QueueUserWorkItem(x =>
                            receiver.BeginReceive((s, e, p) => { lock (lines) { lines.Add(Int32.Parse(s)); } }, null)
                            );
                    }
                    for (int i = 0; i < LIMIT; i++)
                    {
                        sender.BeginSend(i.ToString() + "\n", (e, p) => { }, null);
                    }
                    SpinWait.SpinUntil(() => { lock (lines) { return lines.Count == LIMIT; } });
                    lines.Sort();
                    for (int i = 0; i < LIMIT; i++)
                    {
                        Assert.AreEqual(i, lines[i]);
                    }
                }
                finally
                {
                    //CloseSockets(server, s1, s2);
                }
            }
Beispiel #12
0
            public void run(int port)
            {
                int LIMIT = 1000;
                Socket s1, s2;
                TcpListener server;
                OpenSockets(port, out server, out s1, out s2);
                String[] lines = new String[LIMIT];
                ManualResetEvent mre = new ManualResetEvent(false);
                int count = 0;

                try
                {
                    SS sender = new SS(s1, new UTF8Encoding());
                    StringSocket receiver = new StringSocket(s2, new UTF8Encoding());
                    for (int i = 0; i < LIMIT; i++)
                    {
                        receiver.BeginReceive((s, e, p) => { lines[(int)p] = s; Interlocked.Increment(ref count); }, i);
                    }
                    for (int i = 0; i < LIMIT; i++)
                    {
                        sender.BeginSend(i.ToString() + "\n", (e, p) => { }, null);
                    }
                    SpinWait.SpinUntil(() => count == LIMIT);
                    for (int i = 0; i < LIMIT; i++)
                    {
                        Assert.AreEqual(i.ToString(), lines[i]);
                    }
                }
                finally
                {
                    //CloseSockets(server, s1, s2);
                }
            }
Beispiel #13
0
            public void run(int port)
            {
                Socket s1, s2;
                TcpListener server;
                OpenSockets(port, out server, out s1, out s2);
                String line = "";
                ManualResetEvent mre = new ManualResetEvent(false);

                try
                {
                    SS sender = new SS(s1, new UTF8Encoding());
                    StringSocket receiver = new StringSocket(s2, new UTF8Encoding());
                    StringBuilder text = new StringBuilder();
                    for (int i = 0; i < 100000; i++)
                    {
                        text.Append(i);
                    }
                    String str = text.ToString();
                    text.Append('\n');
                    sender.BeginSend(text.ToString(), (e, p) => { }, null);
                    receiver.BeginReceive((s, e, p) => { line = s; mre.Set(); }, null);
                    mre.WaitOne();
                    Assert.AreEqual(str, line);
                }
                finally
                {
                    //CloseSockets(server, s1, s2);
                }
            }
Beispiel #14
0
            public void run(int port)
            {
                Socket s1, s2;
                TcpListener server;
                OpenSockets(port, out server, out s1, out s2);
                String line = "";
                ManualResetEvent mre = new ManualResetEvent(false);

                try
                {
                    SS sender = new SS(s1, new UTF8Encoding());
                    StringSocket receiver = new StringSocket(s2, new UTF8Encoding());
                    foreach (char c in "Hello\n")
                    {
                        sender.BeginSend(c.ToString(), (e, p) => { }, null);
                    }
                    receiver.BeginReceive((s, e, p) => { line = s; mre.Set(); }, null);
                    mre.WaitOne();
                    Assert.AreEqual("Hello", line);
                }
                finally
                {
                    //CloseSockets(server, s1, s2);
                }
            }
Beispiel #15
0
            public void run(int port)
            {
                Socket s1, s2;
                TcpListener server;
                OpenSockets(port, out server, out s1, out s2);
                object payload = null;
                ManualResetEvent mre = new ManualResetEvent(false);

                try
                {
                    SS sender = new SS(s1, new UTF8Encoding());
                    StringSocket receiver = new StringSocket(s2, new UTF8Encoding());
                    sender.BeginSend("Hello\n", (e, p) => { payload = p; mre.Set(); }, "Payload");
                    mre.WaitOne();
                    Assert.AreEqual("Payload", payload);
                }
                finally
                {
                    //CloseSockets(server, s1, s2);
                }
            }