public void TestTokenMessage() { TokenMessage msg = new TokenMessage(); msg.EncodeHiddenComm("A", "B"); TokenMessage msgTwo = new TokenMessage(); msgTwo.Decode(msg.ToSend); CompareTokenMessages(msg, msgTwo); msg.EncodeMessage("C", "D", "hello!! :D |"); msgTwo.Decode(msg.ToSend); CompareTokenMessages(msg, msgTwo); }
/// <summary> /// The instance so that we can send a message or token. /// </summary> private void sender() { int numConnected = 0; while (numConnected != this.nodeCount) { lock (this.nodes) { numConnected = this.nodes.Count; } Thread.Sleep(100); } TokenMessage msg = new TokenMessage(); msg.EncodeHiddenComm(GlobalConst.serverName, GlobalConst.serverName); lock (this.nodes) { NetworkStream stream = this.nodes.First().GetStream(); } //Need to check the index curIndex = 0; this.tokenCount++; lock (stopwatch) { stopwatch.Start(); } //Send first token //Set a stopwatch and then use that stopwatch here. //Every time ANY tcpclient receives something, reset stopwatch. //If the stopwatch runs out, resend token ad infinitum until SOMETHING tells it to stop //That something is up to you. while (!interrupted) { TcpClient client = null; lock(this.nodes) { client = this.nodes[curIndex]; } actuallySend(client, msg); while (stopwatch.Elapsed.TotalSeconds < 5) { Thread.Sleep(2500); if(!stopwatch.IsRunning) { stopwatch.Start(); } } } }
/// <summary> /// Tokens the listening. /// </summary> private void TokenListening() { int bytesRead = 0; int countTimesSent = 0; byte[] message; NetworkStream stream = this.client.GetStream(); TokenMessage token = new TokenMessage(); //Whenever we receive something, we ALWAYS send something back. while (true) { bytesRead = 0; message = GlobalConst.getSpaceByteArray(GlobalConst.BUFSIZE); try { bytesRead = stream.Read(message, 0, GlobalConst.BUFSIZE); } catch { //socket error. WTF. break; } if(bytesRead == 0) { break; } TokenMessage msg = new TokenMessage(); bool msgOK = msg.Decode(message); if(msg.Token) { //Console.WriteLine("Got token on Node " + this.parentNode.Name); this.hasToken = true; if (this.senderThread.ThreadState.Equals(ThreadState.Stopped)) { UseDelegate(stream, msg); } else { while (this.SenderThread.ThreadState.Equals(ThreadState.WaitSleepJoin) == false) { Thread.Sleep(50); } this.SenderThread.Interrupt(); } } else if (!msgOK) { Console.WriteLine("Got a bad message on Node " + this.parentNode.Name); } else { //Console.WriteLine("Got message on Node {0} ", this.parentNode.Name); if (msg.Sender.Equals(this.parentNode.Name)) { if (msg.FS == '1' || countTimesSent > 3) { this.toSend.Dequeue(); token.EncodeHiddenComm(GlobalConst.serverName, GlobalConst.serverName); this.hasToken = false; while (!this.senderThread.ThreadState.Equals(ThreadState.WaitSleepJoin)) { Thread.Sleep(50); } this.SenderThread.Interrupt(); } else { countTimesSent++; token = msg; } } else if (msg.Destination.Equals(this.parentNode.Name)) { this.parentNode.writeOutMessage(msg); token = msg; token.FS = '1'; } else { token = msg; } UseDelegate(stream, token); } } this.doneReceiving = true; if(!this.doneSending) { SenderThread.Abort(); } while (!this.parentThread.ThreadState.Equals(ThreadState.WaitSleepJoin)) { Thread.Sleep(100); } this.parentThread.Interrupt(); }