protected Buffer writeMessage(final Message msg) throws Exception {
   out_stream.reset();
   dos.reset();
   byte flags = 0;
   dos.writeShort(Version.version); // write the version
   if (msg.getDest() == null) flags += (byte) 2;
   dos.writeByte(flags);
   msg.writeTo(dos);
   return new Buffer(out_stream.getRawBuffer(), 0, out_stream.size());
 }
  void sendMessages() throws Exception {
    if (num_threads > 1 && num_msgs % num_threads != 0) {
      System.err.println(
          "num_msgs (" + num_msgs + " ) has to be divisible by num_threads (" + num_threads + ")");
      return;
    }

    System.out.println(
        "sending "
            + num_msgs
            + " messages ("
            + Util.printBytes(msg_size)
            + ") to "
            + remote
            + ": oob="
            + oob
            + ", "
            + num_threads
            + " sender thread(s)");
    ByteBuffer buf =
        ByteBuffer.allocate(Global.BYTE_SIZE + Global.LONG_SIZE).put(START).putLong(num_msgs);
    Message msg = new Message(null, buf.array());
    // msg.writeTo(output);

    ExposedByteArrayOutputStream out_stream = new ExposedByteArrayOutputStream((int) (msg.size()));
    ExposedDataOutputStream dos = new ExposedDataOutputStream(out_stream);
    byte flags = 0;
    dos.writeShort(Version.version); // write the version
    if (msg.getDest() == null) flags += (byte) 2;
    dos.writeByte(flags);
    msg.writeTo(dos);
    Buffer buffer = new Buffer(out_stream.getRawBuffer(), 0, out_stream.size());

    output_lock.lock(); // need to sync if we have more than 1 sender
    try {
      // msg.writeTo(output);
      output.writeInt(buffer.getLength());
      output.write(buffer.getBuf(), buffer.getOffset(), buffer.getLength());
    } finally {
      output_lock.unlock();
    }

    int msgs_per_sender = num_msgs / num_threads;
    Sender[] senders = new Sender[num_threads];
    for (int i = 0; i < senders.length; i++)
      senders[i] = new Sender(msgs_per_sender, msg_size, num_msgs / 10);
    for (Sender sender : senders) sender.start();
    for (Sender sender : senders) sender.join();
    output.flush();
    System.out.println("done sending " + num_msgs + " to " + remote);
  }
Exemple #3
0
  void sendMcastDiscoveryRequest(Message msg) {
    Buffer buf;
    DatagramPacket packet;
    DataOutputStream out = null;

    try {
      if (msg.getSrc() == null) msg.setSrc(local_addr);
      ExposedByteArrayOutputStream out_stream = new ExposedByteArrayOutputStream(128);
      out = new DataOutputStream(out_stream);
      msg.writeTo(out);
      out.flush(); // flushes contents to out_stream
      buf = new Buffer(out_stream.getRawBuffer(), 0, out_stream.size());
      packet =
          new DatagramPacket(
              buf.getBuf(), buf.getOffset(), buf.getLength(), mcast_addr, mcast_port);
      discovery_reception.reset();
      if (mcast_send_sockets != null) {
        MulticastSocket s;
        for (int i = 0; i < mcast_send_sockets.length; i++) {
          s = mcast_send_sockets[i];
          try {
            s.send(packet);
          } catch (Exception e) {
            log.error("failed sending packet on socket " + s);
          }
        }
      } else { // DEFAULT path
        if (mcast_sock != null) mcast_sock.send(packet);
      }
      waitForDiscoveryRequestReception();
    } catch (IOException ex) {
      log.error("failed sending discovery request", ex);
    } finally {
      Util.close(out);
    }
  }