private void handleForwardingDataInChainBcast(DataOutputStream dout,
			DataInputStream dint, DataOutputStream doutNextD,
			DataInputStream dintNextD) throws IOException {
		// how many messages I will get
		int msgSize = dint.readInt();
		// forward bcast info to next daemon
		if (doutNextD != null) {
			doutNextD.writeByte(TwisterConstants.CHAIN_BCAST_START);
			doutNextD.writeInt(msgSize);
			doutNextD.flush();
		}
		// allocate buffer
		byte[] buff = new byte[TwisterConstants.BCAST_SENDRECV_UNIT];
		// allocate byte stream
		ByteArrayOutputStream bout = new ByteArrayOutputStream();
		// receive each message and forward
		for (int i = 0; i < msgSize; i++) {
			// get msg length and forward
			int msgLen = dint.readInt();
			if (doutNextD != null) {
				doutNextD.writeInt(msgLen);
				doutNextD.flush();
			}
			int len = 0;
			int recvMSGLen = 0;
			// reading msg body and forward
			while ((len = dint.read(buff)) > 0) {
				bout.write(buff, 0, len);
				if (doutNextD != null) {
					doutNextD.write(buff, 0, len);
					doutNextD.flush();
				}
				recvMSGLen = recvMSGLen + len;
				if (recvMSGLen == msgLen) {
					break;
				}
			}
			bout.flush();
			bout.close();
			// spawn a new thread to handle MemCache
			TwisterMessage msg = new GenericBytesMessage(bout.toByteArray());
			this.worker.handleMemCacheInput(msg);
			bout.reset();
			// tell the sender, I get the msg, do ack
			dout.writeByte(TwisterConstants.BCAST_ACK);
			dout.flush();
			// wait for ack from the next daemon, see if I can continue
			// forwarding
			if (dintNextD != null) {
				byte ack = dintNextD.readByte();
				if (ack != TwisterConstants.BCAST_ACK) {
					System.out.println("NO ACK " + ack);
				}
			}
		} // end of big for loop
	}