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

#define MAX 4096
char mesg[MAX];

int main(int argc, char *argv[])
{
    int udp_socket, port, status, size;
    int client_length = 0;
    struct sockaddr_in server, client;

    if (argc !=2)
    {
	fprintf(stderr, "Usage: %s <port>\n",argv[0]);
	exit(1);
    }
    
    port = atoi(argv[1]);
    
    udp_socket = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);

    if (udp_socket == -1)
    {
	perror("unable to open socket!\n");
        exit(1);
    }                                              

    bzero((char *)&server, sizeof(server));
    bzero((char *)&client, sizeof(client));

    server.sin_family = AF_INET;
    server.sin_addr.s_addr = htonl(INADDR_ANY);
    server.sin_port = htons(port);

    status = bind(udp_socket, (struct sockaddr *)&server, sizeof(server));
    if (status == -1)
    {
	perror("cannot bind to port :<\n");
        exit(1);
    }

    for (;;)
    {
	bzero((char *)&mesg,sizeof(mesg));

	size = recvfrom(udp_socket, mesg, MAX, 0,(struct sockaddr *)&client, &client_length);

	printf("mesg=%s size=%d client=%d client_length=%d\n",mesg,size,client.sin_addr.s_addr,client_length);
	
        if (size == -1)
        {
    	    perror("recvfrom error\n");
        }
	
	
	status = sendto(udp_socket, mesg, size, 0, (struct sockaddr *)&client, client_length);
	printf("status=%d size=%d\n",status,size);

        if (status != size)
        {
    	    fprintf(stderr,"sendto error\n");
        }
	
    }

    return 0;
}
