/* this is a UDP sender */

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/select.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
	int sockfd;
	struct sockaddr_in servaddr;
	char buf, buf1;

	if (argc < 3) {
		printf("Usage : a.out IPaddr port\n");
		exit(0);
	}

	memset(&servaddr, 0, sizeof(servaddr));  
	servaddr.sin_family = AF_INET;
	servaddr.sin_port = htons((int)atoi(argv[2]));
	servaddr.sin_addr.s_addr = inet_addr(argv[1]);

	if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
		perror(": socket");
		exit(0);
	}

	{ 
		/* basic algorithm not reliability here */
		int i;
		fd_set rset;
		struct timeval timeout;

		buf = 'A';
		for (i=0; i< 1000; i++) {
			sendto(sockfd, &buf, 1, 0, (struct sockaddr *)&servaddr, 
					sizeof(servaddr));
			buf++;
			if (buf == 'Z'+1) buf = 'A';

			FD_ZERO(&rset);
			FD_SET(sockfd, &rset);
			timeout.tv_sec = 0;
			timeout.tv_usec = 10;

			while (select(64, &rset, NULL, NULL, &timeout) == 0) {
				/* timeout, retransmission */
				sendto(sockfd, &buf, 1, 0, (struct sockaddr *)&servaddr, 
						sizeof(servaddr));
				FD_ZERO(&rset);
				FD_SET(sockfd, &rset);
				timeout.tv_sec = 0;
				timeout.tv_usec = 1000;
			}

			recvfrom(sockfd, &buf1, 1, 0, NULL, NULL);
			printf("got ack i= %d\n", i);
		}



		sleep(3);
		for (i=0; i<4; i++) {
			buf = '+';
			sendto(sockfd, &buf, 1, 0, (struct sockaddr *)&servaddr, 
					sizeof(servaddr));
			sleep(2);
		}
	}



}