+91 9404 340 614 [email protected]
UDP File Transfer - Write a program in C/C++/java/Python using UDP socket for File Transfer
This is 'UDP File Transfer' assignment of Computer Networks (SPPU TE SEM-5) - CS of Savitribai Phule Pune University - Gyaani Buddy
In UDP, the client does not form a connection with the server like in TCP and instead just sends a datagram. Similarly, the server need not accept a connection and just waits for datagrams to arrive. Datagrams upon arrival contain the address of sender which the server uses to send data to the correct client.
Basic working of UDP Socket
1. The server starts and waits for filename. 2. The client sends a filename. 3. The server receives filename. If file is present, server starts reading file and continues to send a buffer filled with file contents encrypted until file-end is reached. 4. End is marked by EOF. 5. File is received as buffers until EOF is received. Then it is decrypted. 6. If Not present, a file not found is sent.
1) Explain User Datagram Protocol, UDP?
2) Is UDP better than TCP?
3) What is the UDP packet format?
This is C code for 'UDP File Transfer' assignment of Computer Networks (SPPU TE SEM-5) - CS of Savitribai Phule Pune University - Gyaani Buddy
//Client.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
int main() {
int fd;
char fileName[2000],afileName[2000],vfileName[2000],file_buffer[2000],c,caufile[70000],aufile[7000000],vfile[1000000];
struct sockaddr_in servaddr;
// Creating socket file descriptor
if ( (fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) {
perror("socket creation failed");
exit(EXIT_FAILURE);
}
memset(&servaddr, 0, sizeof(servaddr));
bzero(&servaddr,sizeof(servaddr));
// Filling server information
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(8000);
servaddr.sin_addr.s_addr = INADDR_ANY;
// servaddr.sin_addr.s_addr=inet_addr("10.10.10.73");
int choice = 1;
while(choice!=4)
{
printf("ENTER \n 1.TEXT \n 2.AUDIO \n 3.VIDEO\n4.EXIT");
scanf("%d",&choice);
char num=choice;
sendto(fd, &num, sizeof(num), 0,(struct sockaddr *)&servaddr, sizeof(struct sockaddr));
switch(choice)
{
case 1:
printf("Enter text file name to send : \n");
scanf("%s",fileName);
sendto(fd, fileName, strlen(fileName), 0,(struct sockaddr *)&servaddr, sizeof(struct sockaddr));
FILE *fp;
fp=fopen(fileName,"r");
if(fp)
{
printf("Reading file contents.\n");
fseek(fp,0,SEEK_END);
size_t file_size=ftell(fp);
fseek(fp,0,SEEK_SET);
if(fread(file_buffer,file_size,1,fp)<=0)
{
printf("Unable to copy file into buffer or empty file.\n");
exit(1);
}
}
else
{
printf("Cannot open file.\n");
exit(0);
}
printf("FILE CONTENTS TO SEND : %s\n",file_buffer);
if(sendto(fd, file_buffer,strlen(file_buffer), 0,(struct sockaddr *)&servaddr, sizeof(struct sockaddr))<0)
{
printf("FILE WAS NOT SENT\n");
}
else
{
printf("FILE SENT\n");
}
fclose(fp);
break;
case 2:
printf("Enter audio file name to send : \n");
scanf("%s",afileName);
sendto(fd, afileName, strlen(afileName), 0,(struct sockaddr *)&servaddr, sizeof(struct sockaddr));
FILE *afp;
afp=fopen(afileName,"r");
fseek(afp,0,SEEK_END);
size_t afsize=ftell(afp);
fseek(afp,0,SEEK_SET);
if(afp)
{
printf("Reading file contents.\n");
if(fread(aufile,afsize,1,afp)<=0)
{
printf("Unable to copy file into buffer or empty file.\n");
exit(1);
}
}
else
{
printf("Could not read audio file.\n");
exit(0);
}
if(sendto(fd, aufile, afsize, 0,(struct sockaddr *)&servaddr, sizeof(struct sockaddr))<0)
{
printf("FILE WAS NOT SENT\n");
}
else
{
printf("FILE SENT\n");
}
fclose(afp);
break;
case 3:
printf("Enter video file name to send : \n");
scanf("%s",vfileName);
sendto(fd, vfileName, strlen(vfileName), 0,(struct sockaddr *)&servaddr, sizeof(struct sockaddr));
FILE *vfp;
vfp=fopen(vfileName,"r");
fseek(vfp, 0, SEEK_END);
size_t vfsize = ftell(vfp);
fseek(vfp, 0, SEEK_SET);
if(vfp)
{
if(fread(vfile, 1, vfsize, vfp)<=0)
{
printf("No contents or error reading file \n");
}
}
else
{
printf("Could not read audio file.\n");
exit(0);
}
if(sendto(fd, vfile, vfsize, 0,(struct sockaddr *)&servaddr, sizeof(struct sockaddr))<0)
{
printf("FILE WAS NOT SENT\n");
}
else
{
printf("FILE SENT\n");
}
fclose(vfp);
break;
case 4:
close(fd);
break;
}
}
}
//Server.c
#include<sys/socket.h>
#include<arpa/inet.h>
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/types.h>
#include<string.h>
#include<stdlib.h>
#define maxlen 70000
#define mlen 100000
int main()
{
char fileName[100];
char filebuffer[2000],caufile[maxlen];
char *vfilep;
int aufile[700000],vfile[mlen];
int sd,connfd,len;
for(int i=0;i<=100;i++){
fileName[i]='\0';
}
struct sockaddr_in servaddr,cliaddr;
sd = socket(AF_INET, SOCK_DGRAM, 0);
if(sd==-1)
{
printf(" socket not created in server\n");
exit(0);
}
else
{
printf("socket created in server\n");
}
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = INADDR_ANY;
servaddr.sin_port = htons(8000);
memset(&(servaddr.sin_zero),'\0',8);
if ( bind(sd, (struct sockaddr *)&servaddr, sizeof(servaddr)) != 0 )
printf("Not binded\n");
else
printf("Binded\n");
len=sizeof(cliaddr);
int choice =1;
while(1)
{
char num;
recvfrom(sd,&num,sizeof(num),0,(struct sockaddr *)&cliaddr, &len);
choice = num;
switch(choice)
{
case 1:
recvfrom(sd,fileName,1024,0,(struct sockaddr *)&cliaddr, &len);
printf("NAME OF TEXT FILE RECEIVED : %s\n",fileName);
FILE *fp;
printf("Contents in the received text file : \n");
recvfrom(sd,filebuffer,1024,0,(struct sockaddr *)&cliaddr, &len);
printf("%s\n",filebuffer);
int fsize=strlen(filebuffer);
fp=fopen(fileName,"w");
if(fp)
{
fwrite(filebuffer, fsize, 1, fp);
printf("File received successfully.\n");
}
else
{
printf("Cannot create to output file.\n");
}
memset(fileName, '\0', sizeof(fileName));
fclose(fp);
break;
case 2:
recvfrom(sd,fileName,1024,0,(struct sockaddr *)&cliaddr, &len);
printf("NAME OF AUDIO FILE RECEIVED : %s\n",fileName);
FILE *afp;
int numbytes;
afp=fopen(fileName,"w");
size_t afsize;
afsize=recvfrom(sd,aufile,700000,0,(struct sockaddr *)&cliaddr, &len);
if(afp)
{
fwrite(aufile, afsize, 1, afp);
printf("File received successfully.\n");
}
else
{
printf("Cannot open output file.\n");
}
memset(fileName, '\0', sizeof(fileName));
fclose(afp);
break;
case 3:
recvfrom(sd,fileName,1024,0,(struct sockaddr *)&cliaddr, &len);
printf("VIDEO FILE NAME RECEIVED : %s\n",fileName);
FILE *vfp;
vfp=fopen(fileName,"w");
size_t vfsize;
vfsize=recvfrom(sd,vfile,100000,0,(struct sockaddr *)&cliaddr, &len);
if(vfp)
{
fwrite(vfile, vfsize, 1, vfp);
printf("File received successfully.\n");
}
else
{
printf("Cannot open output file.\n");
}
fclose(vfp);
break;
case 4:
close(sd);
break;
}
}
return(0);
}
This is C++ code for 'UDP File Transfer' assignment of Computer Networks (SPPU TE SEM-5) - CS of Savitribai Phule Pune University - Gyaani Buddy
Coming Soon...
This is python code for 'UDP File Transfer' assignment of Computer Networks (SPPU TE SEM-5) - CS of Savitribai Phule Pune University - Gyaani Buddy
//sender.py
import socket
import time
import sys
UDP_IP = "127.0.0.1"
UDP_PORT = 5005
buf = 1024
file_name = sys.argv[1]
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(file_name, (UDP_IP, UDP_PORT))
print "Sending %s ..." % file_name
f = open(file_name, "r")
data = f.read(buf)
while(data):
if(sock.sendto(data, (UDP_IP, UDP_PORT))):
data = f.read(buf)
time.sleep(0.02) # Give receiver a bit time to save
sock.close()
f.close()
//receiver.py
import socket
import select
UDP_IP = "127.0.0.1"
IN_PORT = 5005
timeout = 3
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((UDP_IP, IN_PORT))
while True:
data, addr = sock.recvfrom(1024)
if data:
print "File name:", data
file_name = data.strip()
f = open(file_name, 'wb')
while True:
ready = select.select([sock], [], [], timeout)
if ready[0]:
data, addr = sock.recvfrom(1024)
f.write(data)
else:
print "%s Finish!" % file_name
f.close()
break
This is Java code for 'UDP File Transfer' assignment of Computer Networks (SPPU TE SEM-5) - CS of Savitribai Phule Pune University - Gyaani Buddy
//Client.java
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
public class UDPClient {
public static void main(String[] args)throws Exception {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
DatagramSocket s=new DatagramSocket();
InetAddress ia=InetAddress.getLocalHost();
File f1=new File("//home//sanket//CN//UDP basic");
File[] files=f1.listFiles();
StringBuilder sb=new StringBuilder("\n");
int x=0;
for(int i=0;i<files.length;i++)
{
if(files[i].canRead())
{
sb.append(files[i].getName()+" ,size"+files[i].length()+"bytes\n");
x++;
}
}
System.out.println(x+" Files found");
System.out.println(sb);
System.out.println(" Enter filename for download ");
String fname = sc.nextLine();
System.out.println(fname);
boolean flag = false;
int id= 0;
for(int i=0;i<files.length;i++) {
if(files[i].getName().toString().equalsIgnoreCase(fname)) {
flag = true;
id = i;
break;
}
}
if(!flag) {
System.out.println(fname + " does not exist!");
return;
}
File filetocopy=new File(files[id].getAbsolutePath());
FileReader fileReader=new FileReader(filetocopy);
BufferedReader br=new BufferedReader(fileReader);
StringBuilder sb1=new StringBuilder();
String line;
while((line=br.readLine())!=null)
{
sb1.append(line);
sb1.append("\n");
}
System.out.println(sb1.toString());
byte[] sentname=files[id].getName().getBytes();
DatagramPacket p1=new DatagramPacket(sentname,sentname.length,ia,65535);
s.send(p1);
byte[] senttoserver=sb1.toString().getBytes();
DatagramPacket p2=new DatagramPacket(senttoserver,senttoserver.length,ia,65535);
s.send(p2);
s.close();
}
}
//Server.java
import java.io.File;
import java.io.PrintWriter;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.io.FileWriter;
public class UDPServer {
public static void main(String[] args) throws Exception{
System.out.print("hello");
DatagramSocket s=new DatagramSocket(65535);
InetAddress ia=InetAddress.getLocalHost();
byte[]filename=new byte[1000];
byte[]b=new byte[10000000];
//receiving name
DatagramPacket name=new DatagramPacket(filename,filename.length);
s.receive(name);
System.out.print("hello");
System.out.println(new String(name.getData()));
DatagramPacket p=new DatagramPacket(b,b.length);
s.receive(p);
System.out.print("hello");
System.out.println(new String(p.getData()));
//String rec="Received your packet";
//byte[] b1=rec.getBytes();
//System.out.println(b1);
//DatagramPacket p1=new DatagramPacket(b1,b1.length,ia,p.getPort());
//s.send(p1);
String fname=new String(name.getData()).trim();
fname="//home//sanket//CN//"+fname;
System.out.println(fname);
String filedata=new String(p.getData()).trim();
System.out.println(filedata);
PrintWriter pw = new PrintWriter(fname);
pw.println(filedata);
pw.close();
}
}