Client benchmark.cpp

From pCT
#include <errno.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <unistd.h>

#include <chrono>
#include <cstring>
#include <iostream>
#include <string>
#include <thread>

int main(int argc, char *argv[]) {
  int s;
  unsigned short port;
  struct sockaddr_in server;
  struct hostent *hp;
  char buf[4096];

  // if (argc != 3) {
  //  printf("Usage: %s <host address> <port> \n", argv[0]);
  //  exit(1);
  //}
  port = htons(atoi(argv[2]));

  /* Create a datagram socket in the internet domain and use the
   * default protocol (UDP).
   */

  if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
    perror("socket()");
    exit(1);
  }
  struct timeval tv;
  tv.tv_sec = 0;
  tv.tv_usec = 2000;
  if (setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) < 0) {
    perror("Error setting timeout");
  }
  // printf(tvStart.tv_sec);
  /* Set up the server name */
  server.sin_family = AF_INET; /* Internet Domain    */
  server.sin_port = port;      /* Server Port        */
  std::string ip = "192.168.2.20";
  hp = gethostbyname(ip.c_str());
  if (hp == 0) perror("Unknown host");

  bcopy((char *)hp->h_addr, (char *)&server.sin_addr, hp->h_length);

  char msg[] = {0x20, 0xFF, 0xFF, 0x8};  // Send command no ack, request
  /* Send the message in buf to the server */
  unsigned int slen = sizeof(struct sockaddr_in);

  struct timeval tval;
  int rslt;
  int packNum = 65535;

  std::chrono::high_resolution_clock nowTimePoint2;

  auto statSize = 10;
  std::cout << "start\n";
  auto recvdBytes = 0;
  auto timeouts = 0;
  msg[0] = 0x60;
  if (sendto(s, msg, (sizeof(msg)), 0, (struct sockaddr *)&server,
             sizeof(server)) < 0) {
    perror("sendto()");
    exit(2);
  }
  std::this_thread::sleep_for(std::chrono::milliseconds(100));

  for (size_t l = 2480; l <= 4080; l += 100) {
    timeouts = 0;
    msg[3] = (l / 16);
    // printf("%hhX", msg[3]);
    std::cout << (l / 16) * 16 << ',';

    for (size_t i = 0; i < statSize; i++) {
      msg[0] = 0x20;
      auto start = std::chrono::time_point_cast<std::chrono::nanoseconds>(
          nowTimePoint2.now());
      if (sendto(s, msg, (sizeof(msg)), 0, (struct sockaddr *)&server,
                 sizeof(server)) < 0) {
        perror("sendto()");
        exit(2);
      }

      for (size_t j = 0; j < packNum; j++) {
        recvdBytes =
            recvfrom(s, buf, sizeof(buf), 0, (struct sockaddr *)&server, &slen);
        if (recvdBytes <= 0) {
          // std::cout << "ERROR IN RECV\n";
          timeouts++;
        }
      }

      auto stop = std::chrono::time_point_cast<std::chrono::nanoseconds>(
          nowTimePoint2.now());
      auto duration = stop - start;
      std::cout << timeouts << ',';
std::cout << static_cast<unsigned int>(
                       (packNum * 1000.f * 1000.f * 1000.f) / duration.count() *
                       1.f)

                << ',';
      msg[0] = 0x60;
      if (sendto(s, msg, (sizeof(msg)), 0, (struct sockaddr *)&server,
                 sizeof(server)) < 0) {
        perror("sendto()");
        exit(2);
      }
    }

    std::cout << '\n';
  }

  /* Deallocate the socket */
  close(s);
}