Code:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <signal.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int n = fork();
if(n == 0)
{
//server
FILE *fin = NULL; //input file server.ini
short portNo = 3456; //port number of the server
// creating the socket
signal(SIGCHLD,SIG_IGN); //ignore shild signals.
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int sock, length, fromLen, n,m;
sock = socket(AF_INET, SOCK_DGRAM, 0); //open socket
if(sock < 0)
{
printf("Can't open socket!\n");
return 1;
}
length = sizeof(server_addr);
bzero(&server_addr, length);
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY; //host IP
server_addr.sin_port = htons(portNo); //convert port to network byte-order
if(bind(sock, (struct sockaddr *) &server_addr, length) < 0)
{
printf("error binding!\n");
close(sock);
return 1;
}
fromLen = sizeof(struct sockaddr_in);
printf("UDP Socket Running on port = %d\n", portNo);
{
//Accept Client
char buffer[50];
bzero(buffer, 8);
n = recvfrom(sock, buffer, 50, 0, (struct sockaddr*) &client_addr, &fromLen);
if(n < 0)
{
printf("error receiving from client!\n");
close(sock);
return 1;
}
//
//Send File
fin = fopen("in.txt", "r");
char pkt[102];
char buf[100];
char c = ' ';
int i;
int count = 0;
char pkt_id[2];
while(!feof(fin))
{
bzero(pkt, sizeof(pkt));
bzero(buf, sizeof(buf));
bzero(pkt_id, sizeof(pkt_id));
for(i = 0; (i < 100) && (!feof(fin)); i++)
{
fscanf(fin,"%c",&c);
buf[i] = c;
}
if(feof(fin))
{
if( i < 100)
{
buf[i] = NULL;
}
else
{
i = 0;
}
}
//attach packet number
sprintf(pkt_id,"%d", count);
count++;
pkt[0] = pkt_id[0];
pkt[1] = pkt_id[1];
int x;
for(x = 2; x < 102; x++)
{
pkt[x] = buf[x - 2];
}
//
n = sendto(sock, pkt, 102, 0, (struct sockaddr*) &client_addr, fromLen);
printf("\nserver: pkt sent \n");
m=recvfrom(sock, buffer, 50, 0, (struct sockaddr*) &client_addr, &fromLen);
write(1,"server: Got an ack: ",20);
write(1,buffer,m);
if(n < 0)
{
printf("error sending to client!\n");
close(sock);
return 1;
}
if(i == 0)
{
bzero(pkt, sizeof(pkt));
pkt[0] = NULL;
n = sendto(sock, pkt, 102, 0, (struct sockaddr*) &client_addr, fromLen);
}
}
fclose(fin);
//
}
close(sock);
return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////
else
{
FILE *fout = NULL;
char hostName[50]; //server host name
short portNo = 3456; //server port number
sprintf(hostName, "127.0.0.1");
signal(SIGCHLD,SIG_IGN); //ignore shild signals.
int sock, length, n;
struct sockaddr_in server, client;
struct hostent* hp;
char buffer[50];
sock = socket(AF_INET, SOCK_DGRAM, 0);
if(sock < 0)
{
printf("Can't open socket!\n");
return 1;
}
server.sin_family = AF_INET;
hp = gethostbyname(hostName);
if(hp == 0)
{
printf("Can't find Server Host!\n");
close(sock);
return 1;
}
bcopy((char*) hp->h_addr, (char*) &server.sin_addr, hp->h_length);
server.sin_port = htons(portNo);
length = sizeof(struct sockaddr_in);
//Send Dummy Buffer to Server to Identify My Self
n = sendto(sock, buffer, strlen(buffer), 0, &server, length);
if(n < 0)
{
printf("Can't send to server!\n");
close(sock);
return 1;
}
//
//Get File From Server
fout = fopen("out.txt", "w");
char pkt[102];
int i;
char c = ' ';
while(1)
{
bzero(pkt, 102);
n = recvfrom(sock, pkt, 102, 0, &client, &length);
sendto(sock,"pkt received\n", 13, 0, &server, length);
if(n < 0)
{
printf("cant get response from server\n");
close(sock);
return 1;
}
else
{
int id = 0;
char pkt_id[2];
if(pkt[0] != NULL)
{
pkt_id[0] = pkt[0];
}
else if(pkt[1] != NULL)
{
pkt_id[1] = pkt[1];
}
else
{
fclose(fout);
close(sock);
return 0;
}
//print packert id
sscanf(pkt_id,"%d", &id);
printf("client: received PKT_ID = %d\n", id);
//
for(i = 0; i < 100; i++)
{
c = pkt[i+2];
if(c != NULL)
{
fputc(c,fout);
}
else
{
fclose(fout);
close(sock);
return 0;
}
}
}
}