/* pong -- Uses socket-based datagram packet to return a message
 *
 * Jerod Weinman
 * 27 June 2008
 */

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


#define MAX_BUF_SZ 65536


/* Create the listening socket by opening a descriptor, filling in
 * address fields, and binding the socket  */
int mksocket(struct sockaddr_in *addr, int port)
{
		int sock;

		/* Set socket descriptor */
		sock = socket(AF_INET, SOCK_DGRAM, 0);
     
		if (sock<0)
				return -1;

		/* Set the physical address of the socket descriptor */
		bzero(addr, sizeof(*addr));
		addr->sin_family = AF_INET;
    /* Uncomment to accept connections bound for any IP address of the,
       server, if there are more than one */
		//addr->sin_addr.s_addr = INADDR_ANY; 
		addr->sin_port = htons(port);

		/* bind the address and descriptor */
		if ( bind(sock, (struct sockaddr*)addr, sizeof(*addr)) < 0)
		{
				close(sock);
				return -1;
		}

		return sock;
}

int main(int argc, char* argv[])
{
		int msgLen;      /* Length of message we received */
		char msg[MAX_BUF_SZ];       /* Msg buffer */
		int sntLen;
		int port;

		int sock;        
		struct sockaddr_in serv_name; /* Socket address structure */
		struct sockaddr_in from_name; /* Socket address structure */
		socklen_t addrLen;           /* Size of address structure */

		/* Check usage */
		if (argc!=2)
		{
				fprintf(stderr,"Usage: %s port\n",argv[0]);
				exit (1);
		}

		/* Process arguments */
		port = atoi(argv[1]);
     
		/* Set up socket */
		sock = mksocket (&serv_name, port);
		addrLen = sizeof(serv_name);

		if (-1 == sock)
		{
				perror("Error creating socket");
				exit (1);
		}

		/* Read "message" */
		printf("Waiting ..."); fflush(stdout);
		msgLen = recvfrom (sock, msg, MAX_BUF_SZ, 0,
																					(struct sockaddr*)&from_name, &addrLen );
					
		if (-1 == msgLen)
		{
				perror("Error reading from socket");
				close(sock);
				exit(1);
		}
          
		printf(" received %d bytes...",msgLen); fflush(stdout);
          
		/* Send return message */
		sntLen = sendto (sock, msg, msgLen, 0, 
																			(struct sockaddr*)&from_name, addrLen );
					
		if (-1 == sntLen)
		{
				perror("Error sending message");
				close(sock);
				exit(1);
		}
					
		printf("pong!\n"); fflush(stdout);
    close(sock);
}
