#include #include #include #include #include #include #include #include #include /******************************************************************************/ #define MAX_BUF 1600 #define PORT 6987 #define SERVER_ADDR "192.168.202.51" /******************************************************************************/ /** * MAIN - Client - measure latency */ int main(int argc, char* argv[]) { int serverAddrLen; int bindStatus, sendStatus; int clientSocketFD; int recieved; char buffer[MAX_BUF]; char sendBuffer[MAX_BUF]; struct sockaddr_in serverAddr; struct sockaddr_in clientAddr; struct timespec measured, result, systemTime; long timeDiff, sysTime; //set clock sysClkRateSet(5000); //create message strcpy(sendBuffer, "1234\n"); //4bytes /* memset (sendBuffer,'-',1400); sendBuffer[1400]='\n'; /**/ //create socket socketFD = socket(AF_INET, SOCK_DGRAM, 0); //, , ?? IPPROTO_UDP ?? if (socketFD == -1) { perror("Socket creation error"); exit(1); } printf("Socket created\n"); //client address - set structs clientAddr.sin_family = AF_INET; clientAddr.sin_addr.s_addr = INADDR_ANY; clientAddr.sin_port = 0; //bind client bindStatus = bind(clientSocketFD, (struct sockaddr*)&clientAddr, sizeof(clientAddr)); printf("Bind: %d\n",bindStatus); printf("Client binded:\n"); printf("Sending and recieving on port: %d\n", PORT); //server address - set strucs serverAddr.sin_family = AF_INET; inet_aton(SERVER_ADDR, &srv_addr.sin_addr); serverAddr.sin_port = htons(PORT); //set server addr length serverAddrLen = sizeof(serverAddr); //send + recieve + measure time while(1) { //get system time - start measuring clock_gettime(CLOCK_MONOTONIC, &systemTime); //send data sendStatus = sendto( clientSocketFD, sendBuffer, strlen(sendBuffer)+1, 0, (struct sockaddr*)&serverAddr, sizeof(serverAddr) ); printf("Send: %d\n",sendStatus); //recieve data recieved = recvfrom( clientSocketFD, buffer, MAX_BUF, 0,(struct sockaddr*)&serverAddr, &serverAddrLen ); printf("Recieved from %s: %s", inet_ntoa(serverAddr.sin_addr), buffer); //errors if( recieved<=0 ) { printf("ERROR"); } //measure end clock_gettime(CLOCK_MONOTONIC, &measured); //time diff, system time timespec_subtract(&result, &measured, &systemTime); timeDiff = result.tv_nsec/1000000+result.tv_sec*1000; sysTime = systemTime.tv_nsec/1000000+systemTime.tv_sec*1000; //store data - timeDiff + SysTime } //CLOSE close(sockd); return 0; } /******************************************************************************/ /** * Time spec subtract */ int timespec_subtract (struct timespec *result, struct timespec *x, struct timespec *y) { /* Perform the carry for the later subtraction by updating Y. */ if (x->tv_nsec < y->tv_nsec) { int num_sec = (y->tv_nsec - x->tv_nsec) / 1000000000 + 1; y->tv_nsec -= 1000000000 * num_sec; y->tv_sec += num_sec; } if (x->tv_nsec - y->tv_nsec > 1000000000) { int num_sec = (x->tv_nsec - y->tv_nsec) / 1000000000; y->tv_nsec += 1000000000 * num_sec; y->tv_sec -= num_sec; } /* Compute the time remaining to wait. `tv_nsec' is certainly positive. */ result->tv_sec = x->tv_sec - y->tv_sec; result->tv_nsec = x->tv_nsec - y->tv_nsec; /* Return 1 if result is negative. */ return x->tv_sec < y->tv_sec; }