#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);
}