File Transfer Protocol
File Transfer Protocol
By:
Dhruv Patel – 200901130
Lalit Agarwal – 200901159
Under Guidance of
Prof. Sanjay Chaudhary,
DAIICT.
Definition:
server.c
client.c
unp.h
ip.sh
Filename: - server.c
#include<sys/shm.h>
#include"unp.h"
int *downloadstatus;
int *cnt;
struct client
int id;
int fileno;
char ipaddress[20];
char *name;
char list[1000][30];
};
//Function to send the list of files shared by all the clients connected to the server.
int err;
char filename[30];
char handshake[15];
list=clients;
strcpy(handshake,"CNTSTART");
err=write(confd,(const void *)handshake,15);
printf("List sent.\n");
char request='d';
while(*downloadstatus!=id);
*downloadstatus=0;
*downloadstatus=did;
//Function to receive the request given by the client and take appropriate action.
{
int confd=*(int *)fd;
char *c;
int ret=0;
int did;
int array[2];
pthread_t tid;
array[0]=confd;
array[1]=id;
pthread_create(&tid,NULL,idcheck,(void *)array);
while(1)
c=(char *)malloc(2*sizeof(char));
do
ret=read(confd,(void *)c,2);
}while(ret==-1);
if(c[0]=='l')
sendlist(fd);
else if(c[0]=='d')
sleep(1);
read(confd,(void *)&did,sizeof(int));
write(confd,(void *)clients[did].ipaddress,20*sizeof(char));
download(id,did);
else
{
printf("\nClient %d is exiting.\n",id);
clients[id-1].fileno=0;
pthread_exit();
exit(0);
free(c);
int main(void)
int sockfd,j;
int cntaddress,listaddress,daddress;
socklen_t len;
pid_t pid[1000];
cntaddress=shmget(800,sizeof(int),IPC_CREAT | 0755);
daddress=shmget(1000,sizeof(int),IPC_CREAT | 0755);
cnt=(int *)shmat(cntaddress,NULL,0);
downloadstatus=(int *)shmat(daddress,NULL,0);
*downloadstatus=0;
sockfd=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
servaddr.sin_port=htons(13000);
bind(sockfd,(SA *) &servaddr,sizeof(servaddr));
*cnt=0;
listen(sockfd,LISTENQ);
len=sizeof(cliaddr);
printf("\nServer Ready\n");
while(1)
int confd,i;
int ret=0;
char ip[17];
char filename[30];
confd=accept(sockfd,(SA *) &cliaddr,&len);
printf("Connection Established.\n");
ret=read(confd,(void *)ip,17);
if(ret==-1)
printf("read error.\n");
strncpy(clients[*cnt].ipaddress,ip,17);
strcpy(filename,"");
clients[*cnt].id=*cnt+1;
clients[*cnt].fileno=0;
do
do
{ ret=read(confd,(void *)filename,30);
}while(ret==-1);
do
clients[*cnt].fileno++;
do
{ ret=read(confd,(void *)filename,30);
}while(ret==-1);
if(strcmp(filename,"ENDOFFILE")==0) break;
strcpy(clients[*cnt].list[clients[*cnt].fileno],filename);
}while(1);
pid[*cnt]=fork();
if(pid[*cnt]==0)
close(sockfd);
close(confd);
(*cnt)++;
return 0;
Filename: - client.c
#include"unp.h"
#include<errno.h>
#include<dirent.h>
#include<semaphore.h>
int cnt;
sem_t bin_sem;
struct client
int id;
int fileno;
char ipaddress[20];
char *name;
char list[1000][30];
};
//Function to send the list of files shared by this client to the server when it is connected
char path[30];
char s[17];
DIR *dir;
FILE *f;
strcpy(path,"/home/");
strcpy(path,strcat(path,getenv("USER")));
strcpy(path,strcat(path,"/Sample/"));
f=fopen("./ipaddress","r");
fscanf(f,"%s",s);
dir=opendir(path);
if(dir!=NULL)
printf("Directory opened.\n");
char filename[30];
strcpy(filename,"STARTOFFILE");
while((dt=readdir(dir))!=NULL)
strcpy(filename,dt->d_name);
printf("%s\n",filename);
printf("\n");
strcpy(filename,"ENDOFFILE");
int myfd=*fd;
int i;
char c[2];
int ret=0;
char handshake[15];
c[0]='l';
c[1]='\0';
sleep((cnt/3)+1);
do
read(myfd,(void *)handshake,15);
while(strcmp(handshake,"CNTSTART")!=0);
do
{ ret=read(myfd,(void *)&cnt,sizeof(int));
} while(ret==-1);
do
}while(ret==-1);
for(i=0;i<cnt;i++)
int j;
if(list[i].fileno != 0)
for(j=0;j<list[i].fileno;j++)
printf("%s\n",list[i].list[j]);
}
}
printf("\n");
void *s;
int f;
char c[2];
void *filebuf;
char *filename;
char *path;
char remoteip[20];
int clientno,i=0;
int dfd,n;
int filecnt=30;
filebuf=(void *)malloc(4096);
path=(char *)malloc(30);
filename=(char *)malloc(filecnt);
c[0]='d';
c[1]='\0';
scanf("%d",&clientno);
printf("Enter filename:\n");
scanf("%s",filename);
sleep(1);
read(myfd,(void *)remoteip,20*sizeof(char));
dfd=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
servaddr.sin_port=htons(15000);
sleep(3);
if(connect(dfd,(SA *) &servaddr,sizeof(servaddr))<0)
printf("Connection problem.\n");
strcpy(path,"/home/");
strcpy(path,strcat(path,getenv("USER")));
strcpy(path,strcat(path,"/Downloads/"));
strcpy(path,strcat(path,filename));
while(1)
n=read(dfd,filebuf,4096);
write(f,filebuf,4096);
cnt++;
if(n<=0) break;
free(filebuf);
close(f);
close(dfd);
printf("\nDownload finished.\n\n");
return 1;
int sockfd,n;
char c;
void *filebuf;
int f;
char filename[30];
char *path;
int len,confd;
filebuf=(void *)malloc(4096);
path=(char *)malloc(30);
read(myfd,(void *)&c,sizeof(char));
sem_wait(&bin_sem);
//Using another port for file transfer, this client acting as a server.
sockfd=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
servaddr.sin_port=htons(15000);
bind(sockfd,(SA *) &servaddr,sizeof(servaddr));
listen(sockfd,LISTENQ);
len=sizeof(cliaddr);
confd=accept(sockfd,(SA *) &cliaddr,&len);
read(confd,(void *)filename,30);
strcpy(path,"/home/");
strcpy(path,strcat(path,getenv("USER")));
strcpy(path,strcat(path,"/Sample/"));
strcpy(path,strcat(path,filename));
f=open(path,O_RDONLY);
if(f<0)
return;
printf("Uploading %s\n",path);
while(1)
n=read(f,filebuf,4096);
cnt++;
if(n<=0) break;
printf("Uploading Finished\n");
free(filebuf);
close(f);
close(confd);
sem_post(&bin_sem);
int main(void)
{
int myfd;
void *c;
pthread_t tid;
socklen_t len;
FILE* f;
int dreturn;
int ret=0;
char *answer;
char path[100];
c=(void*)malloc(1000);
sem_init(&bin_sem, 0, 0);
myfd=socket(AF_INET,SOCK_STREAM,0);
bzero(&servaddr, sizeof(servaddr));
bzero(&myaddr,sizeof(myaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
servaddr.sin_port=htons(13000);
bind(myfd,(SA *) &myaddr,sizeof(myaddr));
len=sizeof(servaddr);
if(connect(myfd,(SA *) &servaddr,len)!=0)
{ printf("Connection problem.\n");
exit(-1);
sendlist(&myfd);
answer=(char *)malloc(5*sizeof(char));
while(1)
{
pthread_create(&tid,NULL,downloadrequestcheck,&myfd);
sem_post(&bin_sem);
scanf("%s",answer);
pthread_cancel(tid);
sem_wait(&bin_sem);
if(strcmp(answer,"l")==0)
printlist(&myfd);
else if(strcmp(answer,"d")==0)
dreturn=download(&myfd);
else if(strcmp(answer,"q")==0)
char c[2];
c[0]='q';
c[1]='\0';
exit(0);
else
fflush(stdin);
}
}
return 0;
Filename: - ip.sh
set `ifconfig`
shift 6
g=`expr $k - 5`
echo $g
s=${1:5:g}