//IEEE 1588 PTP Protocol slave implementation static void sync_clock(int times, int *sock, struct sockaddr_in *master) { char useless_buffer[FIXED_BUFFER]; int i; //to prevent C99 error in for loop printf("Running IEEE1588 PTP..."); fflush(stdout); send_packet(sock, "ready", 5, NULL, master); //run protocol num of times determined by master for(i = 0; i < times; i++) { sync_packet(sock, master); delay_packet(sock, master); receive_packet(sock, useless_buffer, sizeof(useless_buffer), NULL, NULL); } printf("Done!\n"); }
int main(int argc, char**argv) { int sockfd,n; struct sockaddr_in servaddr; if (argc < 5) { printf("usage: udpcli <IP address>, udp <port number>, srcPort, dstPort\n"); exit(1); } if (sscanf (argv[2], "%i", &ConnectionPort)!=1) { printf ("error - not an integer"); exit(-1); } if (sscanf (argv[3], "%i", &srcPort)!=1) { printf ("error - not an integer"); exit(-1); } if (sscanf (argv[4], "%i", &dstPort)!=1) { printf ("error - not an integer"); exit(-1); } sockfd=socket(AF_INET,SOCK_DGRAM,0); bzero(&servaddr,sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr=inet_addr(argv[1]); servaddr.sin_port=htons(ConnectionPort); // Here we use file descriptor to avoid I/O block at receive side. int timeout =3000; struct timeval tv; fd_set readfds, active_fs; tv.tv_sec = 0; tv.tv_usec = 3000; FD_ZERO(&readfds); FD_SET(sockfd, &readfds); double elapsedTime; int flag =0; //blocking way, it measures the latency in a better way! char sendline[1400]; char recvline[1400]; memset(sendline, 0,1400); sync_packet(sockfd, sendline, &servaddr); n=recvfrom(sockfd,recvline,1400,0,NULL,NULL); //fputs(recvline,stdout); int ack = *(int *) recvline; int seq = *(int *) (recvline +4); int port = *(int *) (recvline+20); printf("Is is sync ack? %d and %d and the port number is %d\n", ack, seq, port); if (ack==2 && seq == SEQUENCENUM && n ==28) { goto confirmed; } confirmed: { int HeaderLength = sizeof(header); char AckMesg[HeaderLength]; header * ackHeader = (header *)AckMesg; ackHeader->action = 3; ackHeader->sequenceNum = SEQUENCENUM; gettimeofday(&t2, NULL); elapsedTime =(t2.tv_usec - t1.tv_usec) + (t2.tv_sec - t1.tv_sec)*1000000; printf("Time is %f\n",elapsedTime); sendto(sockfd,AckMesg,sizeof(header),0,(struct sockaddr *) &servaddr,sizeof(struct sockaddr_in )); /* Here we add keep alive messages to show the mobility can be handled for packets on the fly */ while(1){ sleep(5); keepalive(sockfd, (struct sockaddr *)&servaddr); } return 0; } }