/* *****************************************************
*
* receiver.c
*
******************************************************* */

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <netdb.h>

#include <unistd.h>

#include <pthread.h>

#define LOCALPORT 2000 + (100 * 7) + 2
#define MAXRCVBUFFER 64
#define LOCALIP "XXX.XX.XXX.XX"
#define MYSIZE 0
#define FILESTODO 10

void conversion(int);
void itoc(int, int);
void assignment2(int);
void assignment3(int);
void assignment4(int);
void assignment5(int);
void assignment6(int);
void assignment7(int);
void assignment8(int);
void assignment9(int);
void assignment10(int);

int loopcontrol = 0;
int filesdone = 0;
int mybuffer = 0;
int mypac = 0;
int pid = 0;

char currentack[MAXRCVBUFFER] = "";
char buftmp[MAXRCVBUFFER] = "";
char buf[MAXRCVBUFFER] = "";
char myack[MAXRCVBUFFER] = "";
char clean[MAXRCVBUFFER] = "";

char file_name[MAXRCVBUFFER] = "";
char file_name1[MAXRCVBUFFER] = "";

FILE *ofp;

main()
{
/* ********************************** */
/* initializing sockets and variables */

int sockfd;
struct sockaddr_in my_addr;
struct sockaddr_in their_addr;
int addr_len,addr_len1,addr_len2,addr_len3,numbytes;

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

my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(LOCALPORT);
my_addr.sin_addr.s_addr = inet_addr(LOCALIP);
bzero(&(my_addr.sin_zero),8);

if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr)) == -1)
{
perror("bind->");
exit(1);
}

/* ******************************************************** */
/* receiving file name to process */

addr_len2 = sizeof(struct sockaddr);
if((numbytes = recvfrom(sockfd,file_name,MAXRCVBUFFER,0,
(struct sockaddr *)&their_addr,&addr_len2))== -1)
{
perror("Error Receiving file name...");
exit(1);
}

addr_len3 = sizeof(struct sockaddr);
if((numbytes = recvfrom(sockfd,file_name1,MAXRCVBUFFER,0,
(struct sockaddr *)&their_addr,&addr_len2))== -1)
{
perror("Error Receiving file name...");
exit(1);
}
/* ******************************************************** */
/* ******************************************************** */
/* ******************************************************** */
printf("\nrs: Working...");
printf("\nrs: =================================");
printf("\nrs: Receiving File : %s",file_name1);
printf("\nrs: Output to : %s",file_name);

ofp = fopen(file_name,"w");

while (strcmp(buf,"111110End111110Of111110File111110")!=0)
{
addr_len = sizeof(struct sockaddr);
if((numbytes = recvfrom(sockfd,buf,MAXRCVBUFFER,0,
(struct sockaddr *)&their_addr,&addr_len))== -1)
{
perror("Error Receiving data...");
exit(1);
}

if (strcmp(buf,"111110End111110Of111110File111110")!=0)
{
if (mybuffer>=MYSIZE)
{
fprintf(ofp,"%s",buf);
}
}
/* send ack to sender */
/* =================== */
mypac++;
conversion(mypac);
strcpy(myack,currentack);
if((numbytes = sendto(sockfd,myack,strlen(myack),0,
(struct sockaddr *)&their_addr,sizeof(struct sockaddr)))==-1)
{
perror("Send ack to sender ->");
exit(1);
}
/* =================== */
} /* end of while loop */

printf("\nrs: Finish Processing: %s", file_name);
printf("\nrs: Received packets : %d",mypac-1);
printf("\nrs: =================================");

/* ******************************************************** */
/* ******************************************************** */
/* ******************************************************** */

printf("\n \nrs: Closing socket connection...\n");

close(sockfd);
close(ofp);
}

void conversion(int n)
{
strcpy(currentack,"");
if ((n>=0)&&(n<=9))
itoc(n,0);
if ((n>=10)&&(n<=99))
assignment2(n);
if ((n>=100)&&(n<=999))
assignment3(n);
if ((n>=1000)&&(n<=9999))
assignment4(n);
if ((n>=10000)&&(n<=99999))
assignment5(n);
if ((n>=100000)&&(n<=999999))
assignment6(n);
if ((n>=1000000)&&(n<=9999999))
assignment7(n);
if ((n>=10000000)&&(n<=99999999))
assignment8(n);
if ((n>=100000000)&&(n<=999999999))
assignment9(n);
if ((n>=1000000000)&&(n<=9999999999))
assignment10(n);
}

void assignment2(int nn)
{
int digit0, digit1;
digit0 = nn/10;
digit1 = nn % 10;
itoc(digit0,0);
itoc(digit1,1);
}

void assignment3(int nn)
{
int digit0, digit1, digit2;
digit0 = nn/100;
digit1 = (nn%100) / 10;
digit2 = (nn%100) % 10;
itoc(digit0,0);
itoc(digit1,1);
itoc(digit2,2);
}

void assignment4(int nn)
{
int digit0, digit1, digit2, digit3;
digit0 = nn/1000;
digit1 = (nn%1000) / 100;
digit2 = ((nn%1000) % 100) / 10;
digit3 = ((nn%1000) % 100) % 10;
itoc(digit0,0);
itoc(digit1,1);
itoc(digit2,2);
itoc(digit3,3);
}

void assignment5(int nn)
{
int digit0, digit1, digit2, digit3, digit4;
digit0 = nn/10000;
digit1 = (nn%10000) / 1000;
digit2 = ((nn%10000) % 1000) / 100;
digit3 = (((nn%10000) % 1000) % 100 ) / 10;
digit4 = (((nn%10000) % 1000) % 100 ) % 10;
itoc(digit0,0);
itoc(digit1,1);
itoc(digit2,2);
itoc(digit3,3);
itoc(digit4,4);
}

void assignment6(int nn)
{
int digit0, digit1, digit2, digit3, digit4, digit5;
digit0 = nn/100000;
digit1 = (nn%100000) / 10000;
digit2 = ((nn%100000) % 10000) / 1000;
digit3 = (((nn%100000) % 10000) % 1000) / 100;
digit4 = ((((nn%100000) % 10000) % 1000) % 100) / 10;
digit5 = ((((nn%100000) % 10000) % 1000) % 100) % 10;
itoc(digit0,0);
itoc(digit1,1);
itoc(digit2,2);
itoc(digit3,3);
itoc(digit4,4);
itoc(digit5,5);
}

void assignment7(int nn)
{
int digit0, digit1, digit2, digit3, digit4, digit5, digit6;
digit0 = nn/1000000;
digit1 = (nn%1000000) / 100000;
digit2 = ((nn%1000000) % 100000) / 10000;
digit3 = (((nn%1000000) % 100000) % 10000) / 1000;
digit4 = ((((nn%1000000) % 100000) % 10000) % 1000) / 100;
digit5 = (((((nn%1000000) % 100000) % 10000) % 1000) % 100) / 10;
digit6 = (((((nn%1000000) % 100000) % 10000) % 1000) % 100) % 10;
itoc(digit0,0);
itoc(digit1,1);
itoc(digit2,2);
itoc(digit3,3);
itoc(digit4,4);
itoc(digit5,5);
itoc(digit6,6);
}

void assignment8(int nn)
{
int digit0, digit1, digit2, digit3, digit4, digit5, digit6, digit7;
digit0 = nn/10000000;
digit1 = (nn%10000000) / 1000000;
digit2 = ((nn%10000000) % 1000000) / 100000;
digit3 = (((nn%10000000) % 1000000) % 100000) / 10000;
digit4 = ((((nn%10000000) % 1000000) % 100000) % 10000) / 1000;
digit5 = (((((nn%10000000) % 1000000) % 100000) % 10000) % 1000) / 100;
digit6 = ((((((nn%10000000) % 1000000) % 100000) % 10000) % 1000) % 100) / 10;
digit7 = ((((((nn%10000000) % 1000000) % 100000) % 10000) % 1000) % 100) % 10;
itoc(digit0,0);
itoc(digit1,1);
itoc(digit2,2);
itoc(digit3,3);
itoc(digit4,4);
itoc(digit5,5);
itoc(digit6,6);
itoc(digit7,7);
}

void assignment9(int nn)
{
int digit0, digit1, digit2, digit3, digit4, digit5, digit6, digit7, digit8;
digit0 = nn/100000000;
digit1 = (nn%100000000) / 10000000;
digit2 = ((nn%100000000) % 10000000) / 1000000;
digit3 = (((nn%100000000) % 10000000) % 1000000) / 100000;
digit4 = ((((nn%100000000) % 10000000) % 1000000) % 100000) / 10000;
digit5 = (((((nn%100000000) % 10000000) % 1000000) % 100000) % 10000) / 1000;
digit6 = ((((((nn%100000000) % 10000000) % 1000000) % 100000) % 10000) % 1000) / 100;
digit7 = (((((((nn%100000000) % 10000000) % 1000000) % 100000) % 10000) % 1000) % 100) / 10;
digit8 = (((((((nn%100000000) % 10000000) % 1000000) % 100000) % 10000) % 1000) % 100) % 10;
itoc(digit0,0);
itoc(digit1,1);
itoc(digit2,2);
itoc(digit3,3);
itoc(digit4,4);
itoc(digit5,5);
itoc(digit6,6);
itoc(digit7,7);
itoc(digit8,8);
}

void assignment10(int nn)
{
int digit0, digit1, digit2, digit3, digit4, digit5, digit6, digit7, digit8, digit9;
digit0 = nn/1000000000;
digit1 = (nn%1000000000) / 100000000;
digit2 = ((nn%1000000000) % 100000000) / 10000000;
digit3 = (((nn%1000000000) % 100000000) % 10000000) / 1000000;
digit4 = ((((nn%1000000000) % 100000000) % 10000000) % 1000000) / 100000;
digit5 = (((((nn%1000000000) % 100000000) % 10000000) % 1000000) % 100000) / 10000;
digit6 = ((((((nn%1000000000) % 100000000) % 10000000) % 1000000) % 100000) % 10000) / 1000;
digit7 = (((((((nn%1000000000) % 100000000) % 10000000) % 1000000) % 100000) % 10000) % 1000) / 100;
digit8 = ((((((((nn%1000000000) % 100000000) % 10000000) % 1000000) % 100000) % 10000) % 1000) % 100) / 10;
digit9 = ((((((((nn%1000000000) % 100000000) % 10000000) % 1000000) % 100000) % 10000) % 1000) % 100) % 10;
itoc(digit0,0);
itoc(digit1,1);
itoc(digit2,2);
itoc(digit3,3);
itoc(digit4,4);
itoc(digit5,5);
itoc(digit6,6);
itoc(digit7,7);
itoc(digit8,8);
itoc(digit9,9);
}

void itoc(int nn, int k)
{
switch (nn)
{
case 0: currentack[k]='0'; break;
case 1: currentack[k]='1'; break;
case 2: currentack[k]='2'; break;
case 3: currentack[k]='3'; break;
case 4: currentack[k]='4'; break;
case 5: currentack[k]='5'; break;
case 6: currentack[k]='6'; break;
case 7: currentack[k]='7'; break;
case 8: currentack[k]='8'; break;
case 9: currentack[k]='9'; break;
}
}

www.cpccci.com
www.cpcwebsolutions.com
www.cpcwebdevelopment.com