

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
//#include "clientserver.h"

int w =0;
#define BUFLEN 512

int main(int argc, char **argv)
{

    struct sockaddr_in   si_local, si_remote;
    int                  s;
    int                  port;
    unsigned int         slen;
    char                 buf[BUFLEN];
if(w==0)//stupid line
{//stupid line

    slen     =   sizeof(si_remote);
    if(argc!=2)
    {
        fprintf(stderr, "Usage: %s <port number>\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    port=atoi(argv[1]);
    if(port<1024)
    {
        fprintf(stderr, "Usage: %s <port number>\n", argv[0]);
        fprintf(stderr, "\twhere <port number> shall be > 1023\n");
        exit(EXIT_FAILURE);
    }


    if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1)
    {
        perror("socket");
        exit(EXIT_FAILURE);
    }
    


    memset((char *) &si_local, 0, sizeof(si_local));
    si_local.sin_family       =  AF_INET;
    si_local.sin_port         =  htons(port);
    si_local.sin_addr.s_addr  =  htonl(INADDR_ANY);
    if (bind(s, (const struct sockaddr *)&si_local, sizeof(si_local))==-1)
    {
        perror("bind");
        exit(EXIT_FAILURE);
    }
    
    int long q= 100;
    while(q>0)
    {
        q--;
        memset(buf, 0, sizeof(char)*BUFLEN);

        if (recvfrom(s, buf, BUFLEN, 0, (struct sockaddr *)&si_remote, &slen)==-1)
        {
            perror("recvfrom()");
            exit(EXIT_FAILURE);
        }
 

        if(strstr(buf, ".quit.")!=NULL)
        {
            printf("\".quit.\" Received \n");
            printf("Exiting\n");
            break;
        }
        else
        
        {
            printf("Received packet from %s:%d\n", inet_ntoa(si_remote.sin_addr),
                                ntohs(si_remote.sin_port));
            printf("Data: %s\n", buf);
        }
    }
w++;//stupid line
// Here some code have to added.
}//stupid line
//*********************************************Client************************************
    printf("Hello Client Part\n");
    struct sockaddr_in  si_server;
//    int                 port, s, i, slen=sizeof(si_server);
//    char                buf[BUFLEN];
    char                srv_addr[16]; 

    memset(srv_addr, 0, 16);
    
    if(argc<3)
    {
    fprintf(stderr, "Usage: %s <destination IP address> <port number>\n", argv[0]);
    exit(EXIT_FAILURE);
    } 

    port=atoi(argv[2]);
    printf("port = %d\n", port);
    if(port<1024)
    {
        fprintf(stderr, "Usage: %s <destination IP address> <port number>\n", argv[0]);
        fprintf(stderr, "\twhere <port number> shall be > 1023\n");
        exit(EXIT_FAILURE);
    }


 
    if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1)
    {
        perror("socket");
        exit(EXIT_FAILURE);
    }
        memcpy(srv_addr, argv[1], strlen(argv[1])); 

    memset((char *) &si_server, 0, sizeof(si_server)); 

    si_server.sin_family   =  AF_INET;
    si_server.sin_port     =  htons(port);

    if (inet_aton(srv_addr, &si_server.sin_addr)==0) 
    {
        fprintf(stderr, "inet_aton() failed\n");
        exit(EXIT_FAILURE);
    }
        
 
    if(argc==4)  
    {
        sprintf(buf, "%s", argv[3]);
        if (sendto(s, buf, strlen(argv[3]), 0, (struct sockaddr *)&si_server, slen)==-1)
        {
            perror("sendto()");
            exit(EXIT_FAILURE);
        }
    }

    else 
    {
        int x;
        for (x=0; x<100; x++)
        {
            printf("Sending packet %d\n", x);
            sprintf(buf, "This is packet %d\n", x);
            if (sendto(s, buf, BUFLEN, 0, (struct sockaddr *)&si_server, slen)==-1)
            {
                perror("sendto()");
                exit(EXIT_FAILURE);
            }
        }
    }

close(s);
exit (EXIT_SUCCESS);
w=0;//stupid line    
    return 0;
}
