/// <summary>
 /// The callback method for socket's beginReceive method. A state machine that takes care of incoming strings.
 /// </summary>
 /// <param name="line"></param>
 /// <param name="payload"></param>
 private void RequestReceived(String line, object payload)
 {
     if (line.Trim().Length == 0 && contentLength > 0)
     {
         socket.BeginReceive(ProcessRequest, null, contentLength);
     }
     else if (line.Trim().Length == 0)
     {
         ProcessRequest(null);
     }
     else if (firstLine != null)
     {
         Match m = contentLengthPattern.Match(line);
         if (m.Success)
         {
             contentLength = int.Parse(m.Groups[1].ToString());
         }
         socket.BeginReceive(RequestReceived, null);
     }
     else
     {
         firstLine = line;
         socket.BeginReceive(RequestReceived, null);
     }
 }
        /// <summary>
        /// handles receiving http requests
        /// </summary>
        /// <param name="s"></param>
        /// <param name="p"></param>
        private void Received(string s, object p)
        {
            if (s.Trim().Length == 0 && contentLength > 0)
            {
                socket.BeginReceive(getProperRequest, null, contentLength);
                Console.WriteLine(s);
                return;
            }
            Match match = gameStatusPattern.Match(s);

            if (match.Success)
            {
                parseLine(s);
                socket.BeginReceive(getProperRequest, null);
                Console.WriteLine(s);
                return;
            }

            Console.WriteLine(s);
            for (int i = 0; i < s.Length; i++)
            {
                if (s[i] == '\r')
                {
                    parseLine(s);
                    socket.BeginReceive(Received, null);
                }
                Match m = contentLengthPattern.Match(s);
                if (m.Success)
                {
                    contentLength = int.Parse(m.Groups[1].ToString());
                }
            }
        }
Example #3
0
 private void ReadLines(String line, object p)
 {
     if (line.Trim().Length == 0 && contentLength > 0) // has contentLength header
     {
         ss.BeginReceive(ProcessRequest, null, contentLength);
     }
     else if (line.Trim().Length == 0) // No JSON object in request
     {
         ProcessRequest(null);
     }
     else if (firstLine != null) // if this is not the first line
     {
         Match m = contentLengthPattern.Match(line);
         if (m.Success)
         {
             contentLength = int.Parse(m.Groups[1].ToString());
         }
         ss.BeginReceive(ReadLines, null);
     }
     else // this is the first line
     {
         firstLine = line;
         ss.BeginReceive(ReadLines, null);
     }
 }
Example #4
0
            private void ReadLines(String line, object p)
            {
                // End of request
                if (line.Trim().Length == 0 && contentLength > 0)
                {
                    ss.BeginReceive(ProcessRequest, null, contentLength);
                }

                // No object at end of Request
                else if (line.Trim().Length == 0)
                {
                    ProcessRequest(null);
                }

                // Middle Line: looking for contentLength
                else if (firstLine != null)
                {
                    Match m = contentLengthPattern.Match(line);
                    if (m.Success)
                    {
                        contentLength = int.Parse(m.Groups[1].ToString());
                    }
                    ss.BeginReceive(ReadLines, null);
                }

                // First Line
                else
                {
                    firstLine = line;
                    ss.BeginReceive(ReadLines, null);
                }
            }
Example #5
0
            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 sender   = null;
                SS           receiver = null;

                try
                {
                    sender   = new StringSocket(s1, new UTF8Encoding());
                    receiver = new SS(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, sender, receiver);
                }
            }
Example #6
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);
                StringSocket     sender = null;
                SS receiver             = null;

                try
                {
                    sender   = new StringSocket(s1, new UTF8Encoding());
                    receiver = new SS(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, sender, receiver);
                }
            }
Example #7
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);
                StringSocket     sender = null;
                SS receiver             = null;

                try
                {
                    sender   = new StringSocket(s1, new UTF8Encoding());
                    receiver = new SS(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, sender, receiver);
                }
            }
        /// <summary>
        /// creates a server and calls begin receive
        /// </summary>
        /// <param name="s"></param>
        public SocketComm(SS s)
        {
            socket  = s;
            service = new BoggleService();


            socket.BeginReceive(Received, null);
        }
Example #9
0
            public void run(int port)
            {
                Socket      s1, s2;
                TcpListener server;

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

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

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

                    for (int i = 0; i < LIMIT; i++)
                    {
                        receiver.BeginReceive((s, e, p) => { Interlocked.Decrement(ref count2); }, null);
                    }

                    if (!SpinWait.SpinUntil(() => count1 == 0 && count2 == 0, 5000))
                    {
                        Assert.Fail();
                    }
                }
                finally
                {
                    CloseSockets(server, sender, receiver);
                }
            }
Example #10
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>();
                StringSocket sender   = null;
                SS           receiver = null;

                try
                {
                    sender   = new StringSocket(s1, new UTF8Encoding());
                    receiver = new SS(s2, new UTF8Encoding());
                    for (int i = 0; i < LIMIT; i++)
                    {
                        receiver.BeginReceive((s, e, p) => { lock (lines) { lines.Add(Int32.Parse(s)); } }, null);
                    }
                    for (int i = 0; i < LIMIT; i++)
                    {
                        String s = i.ToString();
                        ThreadPool.QueueUserWorkItem(x =>
                                                     sender.BeginSend(s + "\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, sender, receiver);
                }
            }
Example #11
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;
                StringSocket sender    = null;
                SS           receiver  = null;

                try
                {
                    sender   = new StringSocket(s1, new UTF8Encoding());
                    receiver = new SS(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, sender, receiver);
                }
            }
Example #12
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
                {
                    StringSocket sender = new StringSocket(s1, new UTF8Encoding());
                    SS receiver = new SS(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);
                }
            }
Example #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
                {
                    StringSocket sender = new StringSocket(s1, new UTF8Encoding());
                    SS receiver = new SS(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);
                }
            }
 /// <summary>
 /// Creates a new Connection object with the given socket.
 /// </summary>
 /// <param name="socket"></param>
 public ClientConnection(SS s)
 {
     socket        = s;
     contentLength = 0;
     socket.BeginReceive(RequestReceived, null);
 }
Example #15
0
 public RequestHandler(SS ss)
 {
     this.ss       = ss;
     contentLength = 0;
     ss.BeginReceive(ReadLines, null);
 }
Example #16
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
                {
                    StringSocket sender = new StringSocket(s1, new UTF8Encoding());
                    SS receiver = new SS(s2, new UTF8Encoding());
                    for (int i = 0; i < LIMIT; i++)
                    {
                        receiver.BeginReceive((s, e, p) => { lock (lines) { lines.Add(Int32.Parse(s)); } }, null);
                    }
                    for (int i = 0; i < LIMIT; i++)
                    {
                        String s = i.ToString();
                        ThreadPool.QueueUserWorkItem(x =>
                            sender.BeginSend(s + "\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);
                }
            }
Example #17
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
                {
                    StringSocket sender = new StringSocket(s1, new UTF8Encoding());
                    SS receiver = new SS(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);
                }
            }