C program for file Transfer using UDP
Data can be transferred between two computers using Socket programming in C.
Similarly, files can easily be sent using UDP protocol and a simple client/server.
Security: Handled by encryption.
Protocol : UDP
Encryption: XOR encryption
Algorithm :
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.
The Server :
// server code for UDP socket programming #include <arpa/inet.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <sys/types.h> #include <unistd.h> #define IP_PROTOCOL 0 #define PORT_NO 15050 #define NET_BUF_SIZE 32 #define cipherKey 'S' #define sendrecvflag 0 #define nofile "File Not Found!" // function to clear buffer void clearBuf( char * b) { int i; for (i = 0; i < NET_BUF_SIZE; i++) b[i] = '\0' ; } // function to encrypt char Cipher( char ch) { return ch ^ cipherKey; } // function sending file int sendFile( FILE * fp, char * buf, int s) { int i, len; if (fp == NULL) { strcpy (buf, nofile); len = strlen (nofile); buf[len] = EOF; for (i = 0; i <= len; i++) buf[i] = Cipher(buf[i]); return 1; } char ch, ch2; for (i = 0; i < s; i++) { ch = fgetc (fp); ch2 = Cipher(ch); buf[i] = ch2; if (ch == EOF) return 1; } return 0; } // driver code int main() { int sockfd, nBytes; struct sockaddr_in addr_con; int addrlen = sizeof (addr_con); addr_con.sin_family = AF_INET; addr_con.sin_port = htons(PORT_NO); addr_con.sin_addr.s_addr = INADDR_ANY; char net_buf[NET_BUF_SIZE]; FILE * fp; // socket() sockfd = socket(AF_INET, SOCK_DGRAM, IP_PROTOCOL); if (sockfd < 0) printf ( "\nfile descriptor not received!!\n" ); else printf ( "\nfile descriptor %d received\n" , sockfd); // bind() if (bind(sockfd, ( struct sockaddr*)&addr_con, sizeof (addr_con)) == 0) printf ( "\nSuccessfully binded!\n" ); else printf ( "\nBinding Failed!\n" ); while (1) { printf ( "\nWaiting for file name...\n" ); // receive file name clearBuf(net_buf); nBytes = recvfrom(sockfd, net_buf, NET_BUF_SIZE, sendrecvflag, ( struct sockaddr*)&addr_con, &addrlen); fp = fopen (net_buf, "r" ); printf ( "\nFile Name Received: %s\n" , net_buf); if (fp == NULL) printf ( "\nFile open failed!\n" ); else printf ( "\nFile Successfully opened!\n" ); while (1) { // process if (sendFile(fp, net_buf, NET_BUF_SIZE)) { sendto(sockfd, net_buf, NET_BUF_SIZE, sendrecvflag, ( struct sockaddr*)&addr_con, addrlen); break ; } // send sendto(sockfd, net_buf, NET_BUF_SIZE, sendrecvflag, ( struct sockaddr*)&addr_con, addrlen); clearBuf(net_buf); } if (fp != NULL) fclose (fp); } return 0; } |
The Client:
// client code for UDP socket programming #include <arpa/inet.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <sys/types.h> #include <unistd.h> #define IP_PROTOCOL 0 #define IP_ADDRESS "127.0.0.1" // localhost #define PORT_NO 15050 #define NET_BUF_SIZE 32 #define cipherKey 'S' #define sendrecvflag 0 // function to clear buffer void clearBuf( char * b) { int i; for (i = 0; i < NET_BUF_SIZE; i++) b[i] = '\0' ; } // function for decryption char Cipher( char ch) { return ch ^ cipherKey; } // function to receive file int recvFile( char * buf, int s) { int i; char ch; for (i = 0; i < s; i++) { ch = buf[i]; ch = Cipher(ch); if (ch == EOF) return 1; else printf ( "%c" , ch); } return 0; } // driver code int main() { int sockfd, nBytes; struct sockaddr_in addr_con; int addrlen = sizeof (addr_con); addr_con.sin_family = AF_INET; addr_con.sin_port = htons(PORT_NO); addr_con.sin_addr.s_addr = inet_addr(IP_ADDRESS); char net_buf[NET_BUF_SIZE]; FILE * fp; // socket() sockfd = socket(AF_INET, SOCK_DGRAM, IP_PROTOCOL); if (sockfd < 0) printf ( "\nfile descriptor not received!!\n" ); else printf ( "\nfile descriptor %d received\n" , sockfd); while (1) { printf ( "\nPlease enter file name to receive:\n" ); scanf ( "%s" , net_buf); sendto(sockfd, net_buf, NET_BUF_SIZE, sendrecvflag, ( struct sockaddr*)&addr_con, addrlen); printf ( "\n---------Data Received---------\n" ); while (1) { // receive clearBuf(net_buf); nBytes = recvfrom(sockfd, net_buf, NET_BUF_SIZE, sendrecvflag, ( struct sockaddr*)&addr_con, &addrlen); // process if (recvFile(net_buf, NET_BUF_SIZE)) { break ; } } printf ( "\n-------------------------------\n" ); } return 0; } |
Output :
Server :
Client :
Please Login to comment...