示例#1
0
//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;
	}
	

}