/***************************************/
/*            - UDP client -           */
/***************************************/

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

#define BUFSIZE 1024
#define PORT_NO 2001
#define error(a,b) fprintf(stderr, a, b)

int main(int argc, char *argv[] ){ // arg count, arg vector   

   /************************** Declarations ********************/
   int fd;	                       // socket endpoint	
   int flags;                      // send flags
   struct sockaddr_in server;      // address of server 
   struct sockaddr_in client;      // address of client 
   int server_size;                // length of the sockaddr_in server 
   int client_size;                // length of the sockaddr_in client 
   int bytes;                      // length of buffer 
   int trnmsize;                   // transmitted bytes
   char on;                        // sockopt option
   char buffer[BUFSIZE+1];         // datagram dat buffer area
   char server_addr[16];           // server address	

   /********************** User interface **********************/
   printf(" Message: ");
   scanf("%s",buffer);
   bytes=strlen(buffer)+1;

   /********************** Initialization **********************/
   on    = 1;
   flags = 0;
   sprintf(server_addr, "%s", argv[1]);
   server.sin_family      = AF_INET;
   server.sin_addr.s_addr = inet_addr(server_addr);
   server.sin_port        = htons(PORT_NO);
   server_size = sizeof server;
   client_size = sizeof client;

   /********************** Creating socket **********************/
   fd = socket(AF_INET, SOCK_DGRAM, 0 );
   if ( fd < 0 ) {
      error("%s: Socket creation error\n",argv[0]);
      exit(1);
      }

   /********************** Setting options **********************/
   setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof on);
   setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (char *)&on, sizeof on);

   /********************** Sending data *************************/
   trnmsize = sendto( fd, buffer, bytes, flags, 
		(struct sockaddr *) &server, server_size);
   if ( trnmsize <= 0 ) {
      error("%s: Sendto error (zero byte sended)\n",argv[0]);
      exit(2);
      }

   /********************** User interface ***********************/
   printf (" %i bytes have been sent to server.\n", trnmsize-1);

   close(fd);
   exit(0);
   } 
