public override string ToString() { if (Duration == 0) { return(MsgTyp.ToString()); } else { return("DISCONNECT(" + Duration.ToString() + ")"); } }
private static void ReceiveMessage() { byte[] header = new byte[2]; byte[] messageBody; int length = 0; while (!clientSocket.Poll(1000, SelectMode.SelectRead)) { Thread.Sleep(100); } while (true) { int received = clientSocket.Receive(header, SocketFlags.None); MsgTyp type = GetMsgType(header, ref length); if (length == 0) { continue; } messageBody = new byte[length - 2]; clientSocket.Receive(messageBody, SocketFlags.None); // Create the full message byte[] messageFull = new byte[length]; System.Buffer.BlockCopy(header, 0, messageFull, 0, 2); System.Buffer.BlockCopy(messageBody, 0, messageFull, 2, length - 2); switch (type) { case MsgTyp.Suback: SubscribeResponse(messageFull); break; case MsgTyp.Puback: PublishResponse(messageFull); break; case MsgTyp.Regack: RegisterResponse(messageFull); break; case MsgTyp.Connack: ReceiveResponse(messageFull); break; case MsgTyp.Publish: MessageInterface.PublishWrk publ = new PublishWrk(messageFull); MessageInterface.PubackWrk pubAck = new PubackWrk(); pubAck.puback.topicId = publ.publish.topicId; pubAck.puback.messageId = publ.publish.messageId; clientSocket.Send(pubAck.Serialized, 0, pubAck.puback.length, SocketFlags.None); Console.WriteLine("REceived a message published by the server"); Console.WriteLine("TopicID: " + ASCIIEncoding.ASCII.GetString(publ.publish.topicId)); Console.WriteLine("MsgId: " + ASCIIEncoding.ASCII.GetString(publ.publish.messageId)); Console.WriteLine("Message from the server: " + ASCIIEncoding.ASCII.GetString(publ.publish.data)); Console.WriteLine("Continue ?"); Console.ReadLine(); Console.Clear(); break; } Thread.Sleep(100); } }
private static void SocketLoop(Object sObj) { Socket socket = (Socket)sObj; byte[] header = new byte[2]; byte[] messageBody; socket.Listen(0); Socket handler = socket.Accept(); byte[] clientId = new byte[4]; int length = 0; while (true) { try { handler.Receive(header, 2, SocketFlags.None); } catch (Exception ex) { Console.WriteLine("Exception occured in thread. Closing. " + ex.Message); handler = socket.Accept(); handler.Receive(header, 2, SocketFlags.None); } MsgTyp type = GetMsgType(header, ref length); messageBody = new byte[length - 2]; try { handler.Receive(messageBody); } catch (Exception ex) { Console.WriteLine("Exception occured in thread. Closing. " + ex.Message); return; } // Create the full message byte[] messageFull = new byte[length]; System.Buffer.BlockCopy(header, 0, messageFull, 0, 2); System.Buffer.BlockCopy(messageBody, 0, messageFull, 2, length - 2); switch (type) { case MsgTyp.Connect: ConnackWrk cObj = ProcessConnect(messageFull, ref clientId); handler.Send(cObj.Serialized, 0, cObj.connack.length, SocketFlags.None); break; case MsgTyp.Register: RegackWrk rObj = ProcessRegister(messageFull); handler.Send(rObj.Serialized, 0, rObj.regack.length, SocketFlags.None); break; case MsgTyp.Publish: PubackWrk pObj = ProcessPublish(messageFull); handler.Send(pObj.Serialized, 0, pObj.puback.length, SocketFlags.None); break; case MsgTyp.Subscribe: SubackWrk skObj = ProcessSubscribe(messageFull, clientId); handler.Send(skObj.Serialized, 0, skObj.suback.length, SocketFlags.None); break; case MsgTyp.Puback: PubackWrk pkObj = ProcessPuback(messageFull, clientId, sqliteConnection); handler.Send(pkObj.Serialized, 0, pkObj.puback.length, SocketFlags.None); break; } // Send out message to be published to this client PublishClients(clientId, handler); } }