Ejemplo n.º 1
0
    private bool SetMessagePriorityInQueue(int sender, int senderNo, int priority)
    {
        bool succeed = false;
        int  index   = -1;
        int  counter = -1;

        foreach (TotalOrderMessage x in holdingQ)
        {
            counter++;
            if (x.senderId == sender && x.senderMsgNo == senderNo)
            {
                index = counter;

                break;
            }
        }
        if (index != -1)
        {
            TotalOrderMessage tom = holdingQ[index];
            tom.timeStamp   = priority;
            tom.deliverable = true;
            string originalMsg = tom.message;
            string newMsg      = originalMsg.Substring(0, originalMsg.IndexOf('['));
            newMsg         += priority + "]<EOM>\n";
            holdingQ[index] = tom;
            succeed         = true;
        }
        return(succeed);
    }
Ejemplo n.º 2
0
    // This method sets up a socket for receiving messages from the Network
    private async void ReceiveMulticast()
    {
        // Data buffer for incoming data.
        byte[] bytes = new Byte[1024];

        // Determine the IP address of localhost
        IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
        IPAddress   ipAddress  = null;

        foreach (IPAddress ip in ipHostInfo.AddressList)
        {
            if (ip.AddressFamily == AddressFamily.InterNetwork)
            {
                ipAddress = ip;
                break;
            }
        }

        IPEndPoint localEndPoint = new IPEndPoint(ipAddress, myPort);

        // Create a TCP/IP socket for receiving message from the Network.
        TcpListener listener = new TcpListener(localEndPoint);

        listener.Start(88);

        try
        {
            string data = null;

            // Start listening for connections.
            while (true)
            {
                //Console.WriteLine("Waiting for a connection...");

                // Program is suspended while waiting for an incoming connection.
                TcpClient tcpClient = await listener.AcceptTcpClientAsync();

                //Console.WriteLine("connectted");
                data = null;

                // Receive one message from the network
                while (true)
                {
                    bytes = new byte[1024];
                    NetworkStream readStream = tcpClient.GetStream();
                    int           bytesRec   = await readStream.ReadAsync(bytes, 0, 1024);

                    data += Encoding.ASCII.GetString(bytes, 0, bytesRec);

                    // All messages ends with "<EOM>"
                    // Check whether a complete message has been received
                    if (data.IndexOf("<EOM>") > -1)
                    {
                        break;
                    }
                }
                //***** the data is received, select the type of the data.
                char preamble = data[0];
                switch (preamble)
                {
                case 'M':
                    // a typical message is like: "Msg #3 from Middleware3:[7]<EOM>\n"

                    // retrive sender id and such
                    string keyword             = "Middleware";
                    int    senderPositionInMsg = data.IndexOf(keyword) + keyword.Length;
                    int    columPosition       = data.IndexOf(":");
                    string senderStr           = data.Substring(senderPositionInMsg, columPosition - senderPositionInMsg);


                    int    AtPosition   = data.IndexOf("[");
                    int    EndPosition  = data.IndexOf("]");
                    int    hashPosition = data.IndexOf("#");
                    int    fromPosition = data.IndexOf("from");
                    string restOfString = data.Substring(hashPosition + 1, fromPosition - hashPosition - 1);

                    string MsgStamp    = data.Substring(AtPosition + 1, EndPosition - AtPosition - 1);
                    int    sender      = Int32.Parse(senderStr);    //the sender id
                    int    msgTS       = Int32.Parse(MsgStamp);
                    int    senderMsgNo = Int32.Parse(restOfString); //the no of msg from a particular sender

                    priority = Math.Max(priority + 1, msgTS);
                    TotalOrderMessage currentMsg = new TotalOrderMessage(data, sender, senderMsgNo, priority);
                    holdingQ.Add(currentMsg);
                    ReceivedBoxAppend(data);
                    //*** send proposed message
                    SendProposedMessage(sender, senderMsgNo, priority);
                    break;

                //msessage looks like: Proposed receiver sender msgno priority <EOM>
                case 'P':
                    string[] tokensP = data.Split('.');

                    if (Int32.Parse(tokensP[2]) == myID)
                    {
                        //ReceivedBoxAppend(data);
                        //int receiver = Int32.Parse(tokens[1]);
                        int thisMsgNo = Int32.Parse(tokensP[3]);
                        int thisPrio  = Int32.Parse(tokensP[4]);
                        proposedInfo[thisMsgNo].Add(thisPrio);
                        bool porposedFinished = false;
                        if (proposedInfo[thisMsgNo].Count == 5)
                        {
                            proposedInfo[thisMsgNo].Sort();
                            int maxPriority = proposedInfo[thisMsgNo].Last();
                            //send final
                            SendFinalMessage(thisMsgNo, maxPriority);
                            clock            = Math.Max(clock, maxPriority);
                            porposedFinished = true;
                        }
                        if (porposedFinished)
                        {
                            proposedInfo.Remove(thisMsgNo);
                        }
                    }
                    break;

                //msessage looks like: final sender msgno priority <EOM>
                case 'F':
                    //ReceivedBoxAppend(data);
                    string[] tokensF     = data.Split('.');
                    int      finalSender = Int32.Parse(tokensF[1]);
                    int      finalMsgNo  = Int32.Parse(tokensF[2]);
                    int      finalPrio   = Int32.Parse(tokensF[3]);

                    //TotalOrderMessage tom = holdingQ.Find(x => ());
                    bool succeed = SetMessagePriorityInQueue(finalSender, finalMsgNo, finalPrio);
                    if (!succeed)
                    {
                        Console.WriteLine("Error, cant find a final message in queue");
                        return;
                    }
                    holdingQ = sortHoldingQueue(holdingQ);
                    //if ((holdingQ.First().senderId != finalSender || holdingQ.First().senderMsgNo != finalMsgNo) && holdingQ.First().deliverable == true)
                    //    Console.WriteLine("assertion failed");

                    /*if (holdingQ.First().senderId == finalSender && holdingQ.First().senderMsgNo == finalMsgNo)
                     * {
                     *  TotalOrderMessage tommy = holdingQ.First();
                     *  ReadyBoxAppend(tommy);
                     *  deliveryQ.Add(tommy);
                     *  holdingQ.Remove(tommy);
                     *  clock = Math.Max(tommy.timeStamp, clock) + 1;
                     *  while (holdingQ.Count > 0 && holdingQ.First().deliverable == true)
                     *  {
                     *      TotalOrderMessage jerry = holdingQ.First();
                     *      ReadyBoxAppend(jerry);
                     *      deliveryQ.Add(jerry);
                     *      holdingQ.Remove(jerry);
                     *      clock = Math.Max(jerry.timeStamp, clock) + 1;
                     *  }
                     * }*/
                    while (holdingQ.Count > 0 && holdingQ.First().deliverable == true)
                    {
                        TotalOrderMessage jerry = holdingQ.First();
                        ReadyBoxAppend(jerry);
                        deliveryQ.Add(jerry);
                        holdingQ.Remove(jerry);
                        clock = Math.Max(jerry.timeStamp, clock) + 1;
                    }
                    break;
                }
                string display = "[";
                display      += clock;
                textBox1.Text = display + "]";
            }
        }
        catch (Exception ee)
        {
            Console.WriteLine(ee.ToString());
        }
    }
Ejemplo n.º 3
0
 public void ReadyBoxAppend(TotalOrderMessage tom)
 {
     ReadyBox.Items.Add(tom.message);
 }