Latest commit

History

15 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

FTP

A client-server Implementation of the File Transfer Protocol closely following RFC-959 and Beej's Guide.

Demo

The developer was too lazy to make a screencast. You may want checkout the logs.

Features

  • Closely follows the official spec for FTP : RFC-959
  • Provides basic authentication with multiuser support.
  • Supports multiple client connections.
  • Handles control connection (PI) and data connection (DTP) separately.
  • Supports switching of data connection port with PORT command.
  • Works over localhost, local network and over the internet.
Click here to know about all the supported commands.

Supported commands

All command mentioned below are case insensitive unless otherwise specified.

CommandUsageAction
HELPhelpShow all the available commands
!<cmd>!pwd
!cd ..
!mkdir clientDir
Execute a command on the client itself. Because they are directly executed on client system, these are case sensitive.
NOOPnoopExecute No operation. Serves as a dummy command.
USERUSER <username>
user root
Provide username for login
PASSPASS <password>
pass root
Provide password for login
SYSsysGet System Details Of server
PWDpwdPrint working directory
LISTLIST
ls
ls serverDir
List directory contents
CWDcwd ..
cd ..
cd serverDir
Change working directory
CDUPcdupChange to parent directory
MKDmkd dirName
mkdir dirName
Make directory
RMDrmd dirName
rmdir dirName
Remove directory
STORSTOR putFileOnServer.txt
put putFileOnServer.txt
Send File to Server
RETRRETR getFileFromServer.txt
get getFileFromServer.txt
Retrive File from Server
PORTPORT <IP> <Port>
PORT CURRENT_MACHINE_IP 5643
PORT localhost 9584
PORT 200.212.111.32 8868
Switch data connection IP, Port
QUITquit
exit
Quit the application
ABORTabort
abor
Abort the last command and related data transfer
PASVpasvSwitch to Passive Receive Mode
TYPETYPE A ESwitch the representation type. Default is ASCII Non Print.
MODEMODE SSwitch the transfer mode. Default is Stream.
STRUSTRU FSwitch the File structure Type. Default is File.

How to make

  • git clone and cd in the folder
  • make sure you have make installed, then run make -s
  • it will create a bin folder with two executables client and server

How to Run

  • go to where executables live cd ./bin
  • server needs to be started first. Usage is as follows.
    • ./server This uses port=9000 as default.
    • ./server <portNumber> in case you want to supply custom port number.
  • client can be started as follows.
    • ./client This uses host=localhost and port=9000 as defaults.
    • ./client <serverIP> <serverPort> in case server is on different machine.

Testing

The code has been tested in all three cases mentioned above. The maximum file size tested is 190 MB over the internet and 2.5 GB over localhost. In theory, it should work for even bigger file sizes. File integrity is intact, no corruption occurs during the transfer.

Click here to know more about the testing details.

Localhost

  • Both client and server are on same machine.
  • Use 127.0.0.1 or localhost as Server IP

LAN

  • Both system are on Local Network
  • use localIPs like 192.168.0.9. You must know server's local IP for this.

Internet

  • Both systems want to transfer files over the internet.
  • Internet Testing has been done with VM instances for below 2 scenarios.
    • Scenario 1 : Server and client are both on different VMs. Both have static IP.
    • scenario 2 : Server is on VM with static IP. Client is my machine (behind a router).
    • VM-1 on Google cloud ssh jatin@ftp-tester-1 : acts as server
    • VM-2 on Google cloud ssh jatin@ftp-tester-2 : acts as client
  • Ensure that server has static IP. The easiest way to know if a machine has a static internet IP is :
    • Run the server program on the machine you wish to test for static IP
    • From any other machine telnet <machineInternetIP> <portOnWhichServerIsRUnning=9000>
    • To obtain a machine's internet IP, use curl ifconfig.me
    • It should ideally establish connection, because FTP is based on the telnet protocol. If however, it says No route to Host, then it means the machine is behind a router and NAT is your enemy.
  • Things to keep in mind while creating your VMs for testing -
    • First, create some VM instances on google cloud. Make sure you have free credits.
    • Server needs to have a static IP. In your project, go to VPC network > External IP addresses and reserve static IP address for your machines.
    • On google cloud, all ports are blocked by default. But our ftp-server should be allowed to use ports freely. So we have to add two Firewall rules to allow ingress and egress traffic on all ports on all protocols accessible by all IPs i.e. 0.0.0.0/0
    • Setup ssh login. Then login using ssh <username>@<external-IP>
    • If you don't want to remember external IP's you can also add custom hostnames and resolve them in your /etc/hosts file
    • Then clone the project, make it, and run
    • To connect to server, client needs to know server's static internet ip. That's a pre-requisite.

General Questions

How to analyse what's happening behind the scenes ?

How to analyse

  • Monitoring system calls with strace
    • strace will allow you to monitor relevant system calls as they happen.
    • go to where executable live cd ./bin
    • strace -fe trace=process,network,signal ./bin/server 9000
    • strace -fe trace=process,network,signal ./bin/client 127.0.0.1 9000
  • Monitoring processes, their children, pid, ppid, pgid with ps
    • Use ps fj to see the tree format of all the forks, along with their pid's and ppid's.
  • Generating logs with tee. This is very unpredictable for interactive programs.
    • make | tee logs/makelog.txt
    • ./bin/server | tee logs/serverlog.txt
    • ./bin/client | tee logs/clientlog.txt
  • Hiding all the server logs with output redirection
    • To hide all output from server, send it to the null device
    • ./server &>/dev/null
How is the code in the project formatted ?

How to Format code

  • a chromium based, opinionated.clang-format file is present in project root.
  • This has been used for all the formatting in this project.
  • Set your IDE format settings to file.
  • For VS Code, add these in your setting.json
    "C_Cpp.clang_format_path": "/usr/bin/clang-format-3.8",
    "C_Cpp.clang_format_style": "file",
    "C_Cpp.clang_format_fallbackStyle": "Chromium",
  • Build your own formatter file here
  • Know more about unified formatting across IDE's here
How much work was involved in the project? What's the future scope?
  • The project was divided into a lot of small tasks.
  • The tasks belonged either of the three categories -
    • Must have features,
    • Good to have features, and
    • Future scope.
  • You can find all these details in the extended todo list

About

A client-server Implementation of the File Transfer Protocol closely following RFC-959 and Beej's Guide.

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

15 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

FTP

A client-server Implementation of the File Transfer Protocol closely following RFC-959 and Beej's Guide.

Demo

The developer was too lazy to make a screencast. You may want checkout the logs.

Features

  • Closely follows the official spec for FTP : RFC-959
  • Provides basic authentication with multiuser support.
  • Supports multiple client connections.
  • Handles control connection (PI) and data connection (DTP) separately.
  • Supports switching of data connection port with PORT command.
  • Works over localhost, local network and over the internet.
Click here to know about all the supported commands.

Supported commands

All command mentioned below are case insensitive unless otherwise specified.

CommandUsageAction
HELPhelpShow all the available commands
!<cmd>!pwd
!cd ..
!mkdir clientDir
Execute a command on the client itself. Because they are directly executed on client system, these are case sensitive.
NOOPnoopExecute No operation. Serves as a dummy command.
USERUSER <username>
user root
Provide username for login
PASSPASS <password>
pass root
Provide password for login
SYSsysGet System Details Of server
PWDpwdPrint working directory
LISTLIST
ls
ls serverDir
List directory contents
CWDcwd ..
cd ..
cd serverDir
Change working directory
CDUPcdupChange to parent directory
MKDmkd dirName
mkdir dirName
Make directory
RMDrmd dirName
rmdir dirName
Remove directory
STORSTOR putFileOnServer.txt
put putFileOnServer.txt
Send File to Server
RETRRETR getFileFromServer.txt
get getFileFromServer.txt
Retrive File from Server
PORTPORT <IP> <Port>
PORT CURRENT_MACHINE_IP 5643
PORT localhost 9584
PORT 200.212.111.32 8868
Switch data connection IP, Port
QUITquit
exit
Quit the application
ABORTabort
abor
Abort the last command and related data transfer
PASVpasvSwitch to Passive Receive Mode
TYPETYPE A ESwitch the representation type. Default is ASCII Non Print.
MODEMODE SSwitch the transfer mode. Default is Stream.
STRUSTRU FSwitch the File structure Type. Default is File.

How to make

  • git clone and cd in the folder
  • make sure you have make installed, then run make -s
  • it will create a bin folder with two executables client and server

How to Run

  • go to where executables live cd ./bin
  • server needs to be started first. Usage is as follows.
    • ./server This uses port=9000 as default.
    • ./server <portNumber> in case you want to supply custom port number.
  • client can be started as follows.
    • ./client This uses host=localhost and port=9000 as defaults.
    • ./client <serverIP> <serverPort> in case server is on different machine.

Testing

The code has been tested in all three cases mentioned above. The maximum file size tested is 190 MB over the internet and 2.5 GB over localhost. In theory, it should work for even bigger file sizes. File integrity is intact, no corruption occurs during the transfer.

Click here to know more about the testing details.

Localhost

  • Both client and server are on same machine.
  • Use 127.0.0.1 or localhost as Server IP

LAN

  • Both system are on Local Network
  • use localIPs like 192.168.0.9. You must know server's local IP for this.

Internet

  • Both systems want to transfer files over the internet.
  • Internet Testing has been done with VM instances for below 2 scenarios.
    • Scenario 1 : Server and client are both on different VMs. Both have static IP.
    • scenario 2 : Server is on VM with static IP. Client is my machine (behind a router).
    • VM-1 on Google cloud ssh jatin@ftp-tester-1 : acts as server
    • VM-2 on Google cloud ssh jatin@ftp-tester-2 : acts as client
  • Ensure that server has static IP. The easiest way to know if a machine has a static internet IP is :
    • Run the server program on the machine you wish to test for static IP
    • From any other machine telnet <machineInternetIP> <portOnWhichServerIsRUnning=9000>
    • To obtain a machine's internet IP, use curl ifconfig.me
    • It should ideally establish connection, because FTP is based on the telnet protocol. If however, it says No route to Host, then it means the machine is behind a router and NAT is your enemy.
  • Things to keep in mind while creating your VMs for testing -
    • First, create some VM instances on google cloud. Make sure you have free credits.
    • Server needs to have a static IP. In your project, go to VPC network > External IP addresses and reserve static IP address for your machines.
    • On google cloud, all ports are blocked by default. But our ftp-server should be allowed to use ports freely. So we have to add two Firewall rules to allow ingress and egress traffic on all ports on all protocols accessible by all IPs i.e. 0.0.0.0/0
    • Setup ssh login. Then login using ssh <username>@<external-IP>
    • If you don't want to remember external IP's you can also add custom hostnames and resolve them in your /etc/hosts file
    • Then clone the project, make it, and run
    • To connect to server, client needs to know server's static internet ip. That's a pre-requisite.

General Questions

How to analyse what's happening behind the scenes ?

How to analyse

  • Monitoring system calls with strace
    • strace will allow you to monitor relevant system calls as they happen.
    • go to where executable live cd ./bin
    • strace -fe trace=process,network,signal ./bin/server 9000
    • strace -fe trace=process,network,signal ./bin/client 127.0.0.1 9000
  • Monitoring processes, their children, pid, ppid, pgid with ps
    • Use ps fj to see the tree format of all the forks, along with their pid's and ppid's.
  • Generating logs with tee. This is very unpredictable for interactive programs.
    • make | tee logs/makelog.txt
    • ./bin/server | tee logs/serverlog.txt
    • ./bin/client | tee logs/clientlog.txt
  • Hiding all the server logs with output redirection
    • To hide all output from server, send it to the null device
    • ./server &>/dev/null
How is the code in the project formatted ?

How to Format code

  • a chromium based, opinionated.clang-format file is present in project root.
  • This has been used for all the formatting in this project.
  • Set your IDE format settings to file.
  • For VS Code, add these in your setting.json
    "C_Cpp.clang_format_path": "/usr/bin/clang-format-3.8",
    "C_Cpp.clang_format_style": "file",
    "C_Cpp.clang_format_fallbackStyle": "Chromium",
  • Build your own formatter file here
  • Know more about unified formatting across IDE's here
How much work was involved in the project? What's the future scope?
  • The project was divided into a lot of small tasks.
  • The tasks belonged either of the three categories -
    • Must have features,
    • Good to have features, and
    • Future scope.
  • You can find all these details in the extended todo list

About

A client-server Implementation of the File Transfer Protocol closely following RFC-959 and Beej's Guide.

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

15 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

FTP

A client-server Implementation of the File Transfer Protocol closely following RFC-959 and Beej's Guide.

Demo

The developer was too lazy to make a screencast. You may want checkout the logs.

Features

  • Closely follows the official spec for FTP : RFC-959
  • Provides basic authentication with multiuser support.
  • Supports multiple client connections.
  • Handles control connection (PI) and data connection (DTP) separately.
  • Supports switching of data connection port with PORT command.
  • Works over localhost, local network and over the internet.
Click here to know about all the supported commands.

Supported commands

All command mentioned below are case insensitive unless otherwise specified.

CommandUsageAction
HELPhelpShow all the available commands
!<cmd>!pwd
!cd ..
!mkdir clientDir
Execute a command on the client itself. Because they are directly executed on client system, these are case sensitive.
NOOPnoopExecute No operation. Serves as a dummy command.
USERUSER <username>
user root
Provide username for login
PASSPASS <password>
pass root
Provide password for login
SYSsysGet System Details Of server
PWDpwdPrint working directory
LISTLIST
ls
ls serverDir
List directory contents
CWDcwd ..
cd ..
cd serverDir
Change working directory
CDUPcdupChange to parent directory
MKDmkd dirName
mkdir dirName
Make directory
RMDrmd dirName
rmdir dirName
Remove directory
STORSTOR putFileOnServer.txt
put putFileOnServer.txt
Send File to Server
RETRRETR getFileFromServer.txt
get getFileFromServer.txt
Retrive File from Server
PORTPORT <IP> <Port>
PORT CURRENT_MACHINE_IP 5643
PORT localhost 9584
PORT 200.212.111.32 8868
Switch data connection IP, Port
QUITquit
exit
Quit the application
ABORTabort
abor
Abort the last command and related data transfer
PASVpasvSwitch to Passive Receive Mode
TYPETYPE A ESwitch the representation type. Default is ASCII Non Print.
MODEMODE SSwitch the transfer mode. Default is Stream.
STRUSTRU FSwitch the File structure Type. Default is File.

How to make

  • git clone and cd in the folder
  • make sure you have make installed, then run make -s
  • it will create a bin folder with two executables client and server

How to Run

  • go to where executables live cd ./bin
  • server needs to be started first. Usage is as follows.
    • ./server This uses port=9000 as default.
    • ./server <portNumber> in case you want to supply custom port number.
  • client can be started as follows.
    • ./client This uses host=localhost and port=9000 as defaults.
    • ./client <serverIP> <serverPort> in case server is on different machine.

Testing

The code has been tested in all three cases mentioned above. The maximum file size tested is 190 MB over the internet and 2.5 GB over localhost. In theory, it should work for even bigger file sizes. File integrity is intact, no corruption occurs during the transfer.

Click here to know more about the testing details.

Localhost

  • Both client and server are on same machine.
  • Use 127.0.0.1 or localhost as Server IP

LAN

  • Both system are on Local Network
  • use localIPs like 192.168.0.9. You must know server's local IP for this.

Internet

  • Both systems want to transfer files over the internet.
  • Internet Testing has been done with VM instances for below 2 scenarios.
    • Scenario 1 : Server and client are both on different VMs. Both have static IP.
    • scenario 2 : Server is on VM with static IP. Client is my machine (behind a router).
    • VM-1 on Google cloud ssh jatin@ftp-tester-1 : acts as server
    • VM-2 on Google cloud ssh jatin@ftp-tester-2 : acts as client
  • Ensure that server has static IP. The easiest way to know if a machine has a static internet IP is :
    • Run the server program on the machine you wish to test for static IP
    • From any other machine telnet <machineInternetIP> <portOnWhichServerIsRUnning=9000>
    • To obtain a machine's internet IP, use curl ifconfig.me
    • It should ideally establish connection, because FTP is based on the telnet protocol. If however, it says No route to Host, then it means the machine is behind a router and NAT is your enemy.
  • Things to keep in mind while creating your VMs for testing -
    • First, create some VM instances on google cloud. Make sure you have free credits.
    • Server needs to have a static IP. In your project, go to VPC network > External IP addresses and reserve static IP address for your machines.
    • On google cloud, all ports are blocked by default. But our ftp-server should be allowed to use ports freely. So we have to add two Firewall rules to allow ingress and egress traffic on all ports on all protocols accessible by all IPs i.e. 0.0.0.0/0
    • Setup ssh login. Then login using ssh <username>@<external-IP>
    • If you don't want to remember external IP's you can also add custom hostnames and resolve them in your /etc/hosts file
    • Then clone the project, make it, and run
    • To connect to server, client needs to know server's static internet ip. That's a pre-requisite.

General Questions

How to analyse what's happening behind the scenes ?

How to analyse

  • Monitoring system calls with strace
    • strace will allow you to monitor relevant system calls as they happen.
    • go to where executable live cd ./bin
    • strace -fe trace=process,network,signal ./bin/server 9000
    • strace -fe trace=process,network,signal ./bin/client 127.0.0.1 9000
  • Monitoring processes, their children, pid, ppid, pgid with ps
    • Use ps fj to see the tree format of all the forks, along with their pid's and ppid's.
  • Generating logs with tee. This is very unpredictable for interactive programs.
    • make | tee logs/makelog.txt
    • ./bin/server | tee logs/serverlog.txt
    • ./bin/client | tee logs/clientlog.txt
  • Hiding all the server logs with output redirection
    • To hide all output from server, send it to the null device
    • ./server &>/dev/null
How is the code in the project formatted ?

How to Format code

  • a chromium based, opinionated.clang-format file is present in project root.
  • This has been used for all the formatting in this project.
  • Set your IDE format settings to file.
  • For VS Code, add these in your setting.json
    "C_Cpp.clang_format_path": "/usr/bin/clang-format-3.8",
    "C_Cpp.clang_format_style": "file",
    "C_Cpp.clang_format_fallbackStyle": "Chromium",
  • Build your own formatter file here
  • Know more about unified formatting across IDE's here
How much work was involved in the project? What's the future scope?
  • The project was divided into a lot of small tasks.
  • The tasks belonged either of the three categories -
    • Must have features,
    • Good to have features, and
    • Future scope.
  • You can find all these details in the extended todo list

About

A client-server Implementation of the File Transfer Protocol closely following RFC-959 and Beej's Guide.

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

15 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

FTP

A client-server Implementation of the File Transfer Protocol closely following RFC-959 and Beej's Guide.

Demo

The developer was too lazy to make a screencast. You may want checkout the logs.

Features

  • Closely follows the official spec for FTP : RFC-959
  • Provides basic authentication with multiuser support.
  • Supports multiple client connections.
  • Handles control connection (PI) and data connection (DTP) separately.
  • Supports switching of data connection port with PORT command.
  • Works over localhost, local network and over the internet.
Click here to know about all the supported commands.

Supported commands

All command mentioned below are case insensitive unless otherwise specified.

CommandUsageAction
HELPhelpShow all the available commands
!<cmd>!pwd
!cd ..
!mkdir clientDir
Execute a command on the client itself. Because they are directly executed on client system, these are case sensitive.
NOOPnoopExecute No operation. Serves as a dummy command.
USERUSER <username>
user root
Provide username for login
PASSPASS <password>
pass root
Provide password for login
SYSsysGet System Details Of server
PWDpwdPrint working directory
LISTLIST
ls
ls serverDir
List directory contents
CWDcwd ..
cd ..
cd serverDir
Change working directory
CDUPcdupChange to parent directory
MKDmkd dirName
mkdir dirName
Make directory
RMDrmd dirName
rmdir dirName
Remove directory
STORSTOR putFileOnServer.txt
put putFileOnServer.txt
Send File to Server
RETRRETR getFileFromServer.txt
get getFileFromServer.txt
Retrive File from Server
PORTPORT <IP> <Port>
PORT CURRENT_MACHINE_IP 5643
PORT localhost 9584
PORT 200.212.111.32 8868
Switch data connection IP, Port
QUITquit
exit
Quit the application
ABORTabort
abor
Abort the last command and related data transfer
PASVpasvSwitch to Passive Receive Mode
TYPETYPE A ESwitch the representation type. Default is ASCII Non Print.
MODEMODE SSwitch the transfer mode. Default is Stream.
STRUSTRU FSwitch the File structure Type. Default is File.

How to make

  • git clone and cd in the folder
  • make sure you have make installed, then run make -s
  • it will create a bin folder with two executables client and server

How to Run

  • go to where executables live cd ./bin
  • server needs to be started first. Usage is as follows.
    • ./server This uses port=9000 as default.
    • ./server <portNumber> in case you want to supply custom port number.
  • client can be started as follows.
    • ./client This uses host=localhost and port=9000 as defaults.
    • ./client <serverIP> <serverPort> in case server is on different machine.

Testing

The code has been tested in all three cases mentioned above. The maximum file size tested is 190 MB over the internet and 2.5 GB over localhost. In theory, it should work for even bigger file sizes. File integrity is intact, no corruption occurs during the transfer.

Click here to know more about the testing details.

Localhost

  • Both client and server are on same machine.
  • Use 127.0.0.1 or localhost as Server IP

LAN

  • Both system are on Local Network
  • use localIPs like 192.168.0.9. You must know server's local IP for this.

Internet

  • Both systems want to transfer files over the internet.
  • Internet Testing has been done with VM instances for below 2 scenarios.
    • Scenario 1 : Server and client are both on different VMs. Both have static IP.
    • scenario 2 : Server is on VM with static IP. Client is my machine (behind a router).
    • VM-1 on Google cloud ssh jatin@ftp-tester-1 : acts as server
    • VM-2 on Google cloud ssh jatin@ftp-tester-2 : acts as client
  • Ensure that server has static IP. The easiest way to know if a machine has a static internet IP is :
    • Run the server program on the machine you wish to test for static IP
    • From any other machine telnet <machineInternetIP> <portOnWhichServerIsRUnning=9000>
    • To obtain a machine's internet IP, use curl ifconfig.me
    • It should ideally establish connection, because FTP is based on the telnet protocol. If however, it says No route to Host, then it means the machine is behind a router and NAT is your enemy.
  • Things to keep in mind while creating your VMs for testing -
    • First, create some VM instances on google cloud. Make sure you have free credits.
    • Server needs to have a static IP. In your project, go to VPC network > External IP addresses and reserve static IP address for your machines.
    • On google cloud, all ports are blocked by default. But our ftp-server should be allowed to use ports freely. So we have to add two Firewall rules to allow ingress and egress traffic on all ports on all protocols accessible by all IPs i.e. 0.0.0.0/0
    • Setup ssh login. Then login using ssh <username>@<external-IP>
    • If you don't want to remember external IP's you can also add custom hostnames and resolve them in your /etc/hosts file
    • Then clone the project, make it, and run
    • To connect to server, client needs to know server's static internet ip. That's a pre-requisite.

General Questions

How to analyse what's happening behind the scenes ?

How to analyse

  • Monitoring system calls with strace
    • strace will allow you to monitor relevant system calls as they happen.
    • go to where executable live cd ./bin
    • strace -fe trace=process,network,signal ./bin/server 9000
    • strace -fe trace=process,network,signal ./bin/client 127.0.0.1 9000
  • Monitoring processes, their children, pid, ppid, pgid with ps
    • Use ps fj to see the tree format of all the forks, along with their pid's and ppid's.
  • Generating logs with tee. This is very unpredictable for interactive programs.
    • make | tee logs/makelog.txt
    • ./bin/server | tee logs/serverlog.txt
    • ./bin/client | tee logs/clientlog.txt
  • Hiding all the server logs with output redirection
    • To hide all output from server, send it to the null device
    • ./server &>/dev/null
How is the code in the project formatted ?

How to Format code

  • a chromium based, opinionated.clang-format file is present in project root.
  • This has been used for all the formatting in this project.
  • Set your IDE format settings to file.
  • For VS Code, add these in your setting.json
    "C_Cpp.clang_format_path": "/usr/bin/clang-format-3.8",
    "C_Cpp.clang_format_style": "file",
    "C_Cpp.clang_format_fallbackStyle": "Chromium",
  • Build your own formatter file here
  • Know more about unified formatting across IDE's here
How much work was involved in the project? What's the future scope?
  • The project was divided into a lot of small tasks.
  • The tasks belonged either of the three categories -
    • Must have features,
    • Good to have features, and
    • Future scope.
  • You can find all these details in the extended todo list

About

A client-server Implementation of the File Transfer Protocol closely following RFC-959 and Beej's Guide.

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

15 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

FTP

A client-server Implementation of the File Transfer Protocol closely following RFC-959 and Beej's Guide.

Demo

The developer was too lazy to make a screencast. You may want checkout the logs.

Features

  • Closely follows the official spec for FTP : RFC-959
  • Provides basic authentication with multiuser support.
  • Supports multiple client connections.
  • Handles control connection (PI) and data connection (DTP) separately.
  • Supports switching of data connection port with PORT command.
  • Works over localhost, local network and over the internet.
Click here to know about all the supported commands.

Supported commands

All command mentioned below are case insensitive unless otherwise specified.

CommandUsageAction
HELPhelpShow all the available commands
!<cmd>!pwd
!cd ..
!mkdir clientDir
Execute a command on the client itself. Because they are directly executed on client system, these are case sensitive.
NOOPnoopExecute No operation. Serves as a dummy command.
USERUSER <username>
user root
Provide username for login
PASSPASS <password>
pass root
Provide password for login
SYSsysGet System Details Of server
PWDpwdPrint working directory
LISTLIST
ls
ls serverDir
List directory contents
CWDcwd ..
cd ..
cd serverDir
Change working directory
CDUPcdupChange to parent directory
MKDmkd dirName
mkdir dirName
Make directory
RMDrmd dirName
rmdir dirName
Remove directory
STORSTOR putFileOnServer.txt
put putFileOnServer.txt
Send File to Server
RETRRETR getFileFromServer.txt
get getFileFromServer.txt
Retrive File from Server
PORTPORT <IP> <Port>
PORT CURRENT_MACHINE_IP 5643
PORT localhost 9584
PORT 200.212.111.32 8868
Switch data connection IP, Port
QUITquit
exit
Quit the application
ABORTabort
abor
Abort the last command and related data transfer
PASVpasvSwitch to Passive Receive Mode
TYPETYPE A ESwitch the representation type. Default is ASCII Non Print.
MODEMODE SSwitch the transfer mode. Default is Stream.
STRUSTRU FSwitch the File structure Type. Default is File.

How to make

  • git clone and cd in the folder
  • make sure you have make installed, then run make -s
  • it will create a bin folder with two executables client and server

How to Run

  • go to where executables live cd ./bin
  • server needs to be started first. Usage is as follows.
    • ./server This uses port=9000 as default.
    • ./server <portNumber> in case you want to supply custom port number.
  • client can be started as follows.
    • ./client This uses host=localhost and port=9000 as defaults.
    • ./client <serverIP> <serverPort> in case server is on different machine.

Testing

The code has been tested in all three cases mentioned above. The maximum file size tested is 190 MB over the internet and 2.5 GB over localhost. In theory, it should work for even bigger file sizes. File integrity is intact, no corruption occurs during the transfer.

Click here to know more about the testing details.

Localhost

  • Both client and server are on same machine.
  • Use 127.0.0.1 or localhost as Server IP

LAN

  • Both system are on Local Network
  • use localIPs like 192.168.0.9. You must know server's local IP for this.

Internet

  • Both systems want to transfer files over the internet.
  • Internet Testing has been done with VM instances for below 2 scenarios.
    • Scenario 1 : Server and client are both on different VMs. Both have static IP.
    • scenario 2 : Server is on VM with static IP. Client is my machine (behind a router).
    • VM-1 on Google cloud ssh jatin@ftp-tester-1 : acts as server
    • VM-2 on Google cloud ssh jatin@ftp-tester-2 : acts as client
  • Ensure that server has static IP. The easiest way to know if a machine has a static internet IP is :
    • Run the server program on the machine you wish to test for static IP
    • From any other machine telnet <machineInternetIP> <portOnWhichServerIsRUnning=9000>
    • To obtain a machine's internet IP, use curl ifconfig.me
    • It should ideally establish connection, because FTP is based on the telnet protocol. If however, it says No route to Host, then it means the machine is behind a router and NAT is your enemy.
  • Things to keep in mind while creating your VMs for testing -
    • First, create some VM instances on google cloud. Make sure you have free credits.
    • Server needs to have a static IP. In your project, go to VPC network > External IP addresses and reserve static IP address for your machines.
    • On google cloud, all ports are blocked by default. But our ftp-server should be allowed to use ports freely. So we have to add two Firewall rules to allow ingress and egress traffic on all ports on all protocols accessible by all IPs i.e. 0.0.0.0/0
    • Setup ssh login. Then login using ssh <username>@<external-IP>
    • If you don't want to remember external IP's you can also add custom hostnames and resolve them in your /etc/hosts file
    • Then clone the project, make it, and run
    • To connect to server, client needs to know server's static internet ip. That's a pre-requisite.

General Questions

How to analyse what's happening behind the scenes ?

How to analyse

  • Monitoring system calls with strace
    • strace will allow you to monitor relevant system calls as they happen.
    • go to where executable live cd ./bin
    • strace -fe trace=process,network,signal ./bin/server 9000
    • strace -fe trace=process,network,signal ./bin/client 127.0.0.1 9000
  • Monitoring processes, their children, pid, ppid, pgid with ps
    • Use ps fj to see the tree format of all the forks, along with their pid's and ppid's.
  • Generating logs with tee. This is very unpredictable for interactive programs.
    • make | tee logs/makelog.txt
    • ./bin/server | tee logs/serverlog.txt
    • ./bin/client | tee logs/clientlog.txt
  • Hiding all the server logs with output redirection
    • To hide all output from server, send it to the null device
    • ./server &>/dev/null
How is the code in the project formatted ?

How to Format code

  • a chromium based, opinionated.clang-format file is present in project root.
  • This has been used for all the formatting in this project.
  • Set your IDE format settings to file.
  • For VS Code, add these in your setting.json
    "C_Cpp.clang_format_path": "/usr/bin/clang-format-3.8",
    "C_Cpp.clang_format_style": "file",
    "C_Cpp.clang_format_fallbackStyle": "Chromium",
  • Build your own formatter file here
  • Know more about unified formatting across IDE's here
How much work was involved in the project? What's the future scope?
  • The project was divided into a lot of small tasks.
  • The tasks belonged either of the three categories -
    • Must have features,
    • Good to have features, and
    • Future scope.
  • You can find all these details in the extended todo list

About

A client-server Implementation of the File Transfer Protocol closely following RFC-959 and Beej's Guide.

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

15 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

FTP

A client-server Implementation of the File Transfer Protocol closely following RFC-959 and Beej's Guide.

Demo

The developer was too lazy to make a screencast. You may want checkout the logs.

Features

  • Closely follows the official spec for FTP : RFC-959
  • Provides basic authentication with multiuser support.
  • Supports multiple client connections.
  • Handles control connection (PI) and data connection (DTP) separately.
  • Supports switching of data connection port with PORT command.
  • Works over localhost, local network and over the internet.
Click here to know about all the supported commands.

Supported commands

All command mentioned below are case insensitive unless otherwise specified.

CommandUsageAction
HELPhelpShow all the available commands
!<cmd>!pwd
!cd ..
!mkdir clientDir
Execute a command on the client itself. Because they are directly executed on client system, these are case sensitive.
NOOPnoopExecute No operation. Serves as a dummy command.
USERUSER <username>
user root
Provide username for login
PASSPASS <password>
pass root
Provide password for login
SYSsysGet System Details Of server
PWDpwdPrint working directory
LISTLIST
ls
ls serverDir
List directory contents
CWDcwd ..
cd ..
cd serverDir
Change working directory
CDUPcdupChange to parent directory
MKDmkd dirName
mkdir dirName
Make directory
RMDrmd dirName
rmdir dirName
Remove directory
STORSTOR putFileOnServer.txt
put putFileOnServer.txt
Send File to Server
RETRRETR getFileFromServer.txt
get getFileFromServer.txt
Retrive File from Server
PORTPORT <IP> <Port>
PORT CURRENT_MACHINE_IP 5643
PORT localhost 9584
PORT 200.212.111.32 8868
Switch data connection IP, Port
QUITquit
exit
Quit the application
ABORTabort
abor
Abort the last command and related data transfer
PASVpasvSwitch to Passive Receive Mode
TYPETYPE A ESwitch the representation type. Default is ASCII Non Print.
MODEMODE SSwitch the transfer mode. Default is Stream.
STRUSTRU FSwitch the File structure Type. Default is File.

How to make

  • git clone and cd in the folder
  • make sure you have make installed, then run make -s
  • it will create a bin folder with two executables client and server

How to Run

  • go to where executables live cd ./bin
  • server needs to be started first. Usage is as follows.
    • ./server This uses port=9000 as default.
    • ./server <portNumber> in case you want to supply custom port number.
  • client can be started as follows.
    • ./client This uses host=localhost and port=9000 as defaults.
    • ./client <serverIP> <serverPort> in case server is on different machine.

Testing

The code has been tested in all three cases mentioned above. The maximum file size tested is 190 MB over the internet and 2.5 GB over localhost. In theory, it should work for even bigger file sizes. File integrity is intact, no corruption occurs during the transfer.

Click here to know more about the testing details.

Localhost

  • Both client and server are on same machine.
  • Use 127.0.0.1 or localhost as Server IP

LAN

  • Both system are on Local Network
  • use localIPs like 192.168.0.9. You must know server's local IP for this.

Internet

  • Both systems want to transfer files over the internet.
  • Internet Testing has been done with VM instances for below 2 scenarios.
    • Scenario 1 : Server and client are both on different VMs. Both have static IP.
    • scenario 2 : Server is on VM with static IP. Client is my machine (behind a router).
    • VM-1 on Google cloud ssh jatin@ftp-tester-1 : acts as server
    • VM-2 on Google cloud ssh jatin@ftp-tester-2 : acts as client
  • Ensure that server has static IP. The easiest way to know if a machine has a static internet IP is :
    • Run the server program on the machine you wish to test for static IP
    • From any other machine telnet <machineInternetIP> <portOnWhichServerIsRUnning=9000>
    • To obtain a machine's internet IP, use curl ifconfig.me
    • It should ideally establish connection, because FTP is based on the telnet protocol. If however, it says No route to Host, then it means the machine is behind a router and NAT is your enemy.
  • Things to keep in mind while creating your VMs for testing -
    • First, create some VM instances on google cloud. Make sure you have free credits.
    • Server needs to have a static IP. In your project, go to VPC network > External IP addresses and reserve static IP address for your machines.
    • On google cloud, all ports are blocked by default. But our ftp-server should be allowed to use ports freely. So we have to add two Firewall rules to allow ingress and egress traffic on all ports on all protocols accessible by all IPs i.e. 0.0.0.0/0
    • Setup ssh login. Then login using ssh <username>@<external-IP>
    • If you don't want to remember external IP's you can also add custom hostnames and resolve them in your /etc/hosts file
    • Then clone the project, make it, and run
    • To connect to server, client needs to know server's static internet ip. That's a pre-requisite.

General Questions

How to analyse what's happening behind the scenes ?

How to analyse

  • Monitoring system calls with strace
    • strace will allow you to monitor relevant system calls as they happen.
    • go to where executable live cd ./bin
    • strace -fe trace=process,network,signal ./bin/server 9000
    • strace -fe trace=process,network,signal ./bin/client 127.0.0.1 9000
  • Monitoring processes, their children, pid, ppid, pgid with ps
    • Use ps fj to see the tree format of all the forks, along with their pid's and ppid's.
  • Generating logs with tee. This is very unpredictable for interactive programs.
    • make | tee logs/makelog.txt
    • ./bin/server | tee logs/serverlog.txt
    • ./bin/client | tee logs/clientlog.txt
  • Hiding all the server logs with output redirection
    • To hide all output from server, send it to the null device
    • ./server &>/dev/null
How is the code in the project formatted ?

How to Format code

  • a chromium based, opinionated.clang-format file is present in project root.
  • This has been used for all the formatting in this project.
  • Set your IDE format settings to file.
  • For VS Code, add these in your setting.json
    "C_Cpp.clang_format_path": "/usr/bin/clang-format-3.8",
    "C_Cpp.clang_format_style": "file",
    "C_Cpp.clang_format_fallbackStyle": "Chromium",
  • Build your own formatter file here
  • Know more about unified formatting across IDE's here
How much work was involved in the project? What's the future scope?
  • The project was divided into a lot of small tasks.
  • The tasks belonged either of the three categories -
    • Must have features,
    • Good to have features, and
    • Future scope.
  • You can find all these details in the extended todo list

About

A client-server Implementation of the File Transfer Protocol closely following RFC-959 and Beej's Guide.

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

15 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

FTP

A client-server Implementation of the File Transfer Protocol closely following RFC-959 and Beej's Guide.

Demo

The developer was too lazy to make a screencast. You may want checkout the logs.

Features

  • Closely follows the official spec for FTP : RFC-959
  • Provides basic authentication with multiuser support.
  • Supports multiple client connections.
  • Handles control connection (PI) and data connection (DTP) separately.
  • Supports switching of data connection port with PORT command.
  • Works over localhost, local network and over the internet.
Click here to know about all the supported commands.

Supported commands

All command mentioned below are case insensitive unless otherwise specified.

CommandUsageAction
HELPhelpShow all the available commands
!<cmd>!pwd
!cd ..
!mkdir clientDir
Execute a command on the client itself. Because they are directly executed on client system, these are case sensitive.
NOOPnoopExecute No operation. Serves as a dummy command.
USERUSER <username>
user root
Provide username for login
PASSPASS <password>
pass root
Provide password for login
SYSsysGet System Details Of server
PWDpwdPrint working directory
LISTLIST
ls
ls serverDir
List directory contents
CWDcwd ..
cd ..
cd serverDir
Change working directory
CDUPcdupChange to parent directory
MKDmkd dirName
mkdir dirName
Make directory
RMDrmd dirName
rmdir dirName
Remove directory
STORSTOR putFileOnServer.txt
put putFileOnServer.txt
Send File to Server
RETRRETR getFileFromServer.txt
get getFileFromServer.txt
Retrive File from Server
PORTPORT <IP> <Port>
PORT CURRENT_MACHINE_IP 5643
PORT localhost 9584
PORT 200.212.111.32 8868
Switch data connection IP, Port
QUITquit
exit
Quit the application
ABORTabort
abor
Abort the last command and related data transfer
PASVpasvSwitch to Passive Receive Mode
TYPETYPE A ESwitch the representation type. Default is ASCII Non Print.
MODEMODE SSwitch the transfer mode. Default is Stream.
STRUSTRU FSwitch the File structure Type. Default is File.

How to make

  • git clone and cd in the folder
  • make sure you have make installed, then run make -s
  • it will create a bin folder with two executables client and server

How to Run

  • go to where executables live cd ./bin
  • server needs to be started first. Usage is as follows.
    • ./server This uses port=9000 as default.
    • ./server <portNumber> in case you want to supply custom port number.
  • client can be started as follows.
    • ./client This uses host=localhost and port=9000 as defaults.
    • ./client <serverIP> <serverPort> in case server is on different machine.

Testing

The code has been tested in all three cases mentioned above. The maximum file size tested is 190 MB over the internet and 2.5 GB over localhost. In theory, it should work for even bigger file sizes. File integrity is intact, no corruption occurs during the transfer.

Click here to know more about the testing details.

Localhost

  • Both client and server are on same machine.
  • Use 127.0.0.1 or localhost as Server IP

LAN

  • Both system are on Local Network
  • use localIPs like 192.168.0.9. You must know server's local IP for this.

Internet

  • Both systems want to transfer files over the internet.
  • Internet Testing has been done with VM instances for below 2 scenarios.
    • Scenario 1 : Server and client are both on different VMs. Both have static IP.
    • scenario 2 : Server is on VM with static IP. Client is my machine (behind a router).
    • VM-1 on Google cloud ssh jatin@ftp-tester-1 : acts as server
    • VM-2 on Google cloud ssh jatin@ftp-tester-2 : acts as client
  • Ensure that server has static IP. The easiest way to know if a machine has a static internet IP is :
    • Run the server program on the machine you wish to test for static IP
    • From any other machine telnet <machineInternetIP> <portOnWhichServerIsRUnning=9000>
    • To obtain a machine's internet IP, use curl ifconfig.me
    • It should ideally establish connection, because FTP is based on the telnet protocol. If however, it says No route to Host, then it means the machine is behind a router and NAT is your enemy.
  • Things to keep in mind while creating your VMs for testing -
    • First, create some VM instances on google cloud. Make sure you have free credits.
    • Server needs to have a static IP. In your project, go to VPC network > External IP addresses and reserve static IP address for your machines.
    • On google cloud, all ports are blocked by default. But our ftp-server should be allowed to use ports freely. So we have to add two Firewall rules to allow ingress and egress traffic on all ports on all protocols accessible by all IPs i.e. 0.0.0.0/0
    • Setup ssh login. Then login using ssh <username>@<external-IP>
    • If you don't want to remember external IP's you can also add custom hostnames and resolve them in your /etc/hosts file
    • Then clone the project, make it, and run
    • To connect to server, client needs to know server's static internet ip. That's a pre-requisite.

General Questions

How to analyse what's happening behind the scenes ?

How to analyse

  • Monitoring system calls with strace
    • strace will allow you to monitor relevant system calls as they happen.
    • go to where executable live cd ./bin
    • strace -fe trace=process,network,signal ./bin/server 9000
    • strace -fe trace=process,network,signal ./bin/client 127.0.0.1 9000
  • Monitoring processes, their children, pid, ppid, pgid with ps
    • Use ps fj to see the tree format of all the forks, along with their pid's and ppid's.
  • Generating logs with tee. This is very unpredictable for interactive programs.
    • make | tee logs/makelog.txt
    • ./bin/server | tee logs/serverlog.txt
    • ./bin/client | tee logs/clientlog.txt
  • Hiding all the server logs with output redirection
    • To hide all output from server, send it to the null device
    • ./server &>/dev/null
How is the code in the project formatted ?

How to Format code

  • a chromium based, opinionated.clang-format file is present in project root.
  • This has been used for all the formatting in this project.
  • Set your IDE format settings to file.
  • For VS Code, add these in your setting.json
    "C_Cpp.clang_format_path": "/usr/bin/clang-format-3.8",
    "C_Cpp.clang_format_style": "file",
    "C_Cpp.clang_format_fallbackStyle": "Chromium",
  • Build your own formatter file here
  • Know more about unified formatting across IDE's here
How much work was involved in the project? What's the future scope?
  • The project was divided into a lot of small tasks.
  • The tasks belonged either of the three categories -
    • Must have features,
    • Good to have features, and
    • Future scope.
  • You can find all these details in the extended todo list

About

A client-server Implementation of the File Transfer Protocol closely following RFC-959 and Beej's Guide.

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

15 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

FTP

A client-server Implementation of the File Transfer Protocol closely following RFC-959 and Beej's Guide.

Demo

The developer was too lazy to make a screencast. You may want checkout the logs.

Features

  • Closely follows the official spec for FTP : RFC-959
  • Provides basic authentication with multiuser support.
  • Supports multiple client connections.
  • Handles control connection (PI) and data connection (DTP) separately.
  • Supports switching of data connection port with PORT command.
  • Works over localhost, local network and over the internet.
Click here to know about all the supported commands.

Supported commands

All command mentioned below are case insensitive unless otherwise specified.

CommandUsageAction
HELPhelpShow all the available commands
!<cmd>!pwd
!cd ..
!mkdir clientDir
Execute a command on the client itself. Because they are directly executed on client system, these are case sensitive.
NOOPnoopExecute No operation. Serves as a dummy command.
USERUSER <username>
user root
Provide username for login
PASSPASS <password>
pass root
Provide password for login
SYSsysGet System Details Of server
PWDpwdPrint working directory
LISTLIST
ls
ls serverDir
List directory contents
CWDcwd ..
cd ..
cd serverDir
Change working directory
CDUPcdupChange to parent directory
MKDmkd dirName
mkdir dirName
Make directory
RMDrmd dirName
rmdir dirName
Remove directory
STORSTOR putFileOnServer.txt
put putFileOnServer.txt
Send File to Server
RETRRETR getFileFromServer.txt
get getFileFromServer.txt
Retrive File from Server
PORTPORT <IP> <Port>
PORT CURRENT_MACHINE_IP 5643
PORT localhost 9584
PORT 200.212.111.32 8868
Switch data connection IP, Port
QUITquit
exit
Quit the application
ABORTabort
abor
Abort the last command and related data transfer
PASVpasvSwitch to Passive Receive Mode
TYPETYPE A ESwitch the representation type. Default is ASCII Non Print.
MODEMODE SSwitch the transfer mode. Default is Stream.
STRUSTRU FSwitch the File structure Type. Default is File.

How to make

  • git clone and cd in the folder
  • make sure you have make installed, then run make -s
  • it will create a bin folder with two executables client and server

How to Run

  • go to where executables live cd ./bin
  • server needs to be started first. Usage is as follows.
    • ./server This uses port=9000 as default.
    • ./server <portNumber> in case you want to supply custom port number.
  • client can be started as follows.
    • ./client This uses host=localhost and port=9000 as defaults.
    • ./client <serverIP> <serverPort> in case server is on different machine.

Testing

The code has been tested in all three cases mentioned above. The maximum file size tested is 190 MB over the internet and 2.5 GB over localhost. In theory, it should work for even bigger file sizes. File integrity is intact, no corruption occurs during the transfer.

Click here to know more about the testing details.

Localhost

  • Both client and server are on same machine.
  • Use 127.0.0.1 or localhost as Server IP

LAN

  • Both system are on Local Network
  • use localIPs like 192.168.0.9. You must know server's local IP for this.

Internet

  • Both systems want to transfer files over the internet.
  • Internet Testing has been done with VM instances for below 2 scenarios.
    • Scenario 1 : Server and client are both on different VMs. Both have static IP.
    • scenario 2 : Server is on VM with static IP. Client is my machine (behind a router).
    • VM-1 on Google cloud ssh jatin@ftp-tester-1 : acts as server
    • VM-2 on Google cloud ssh jatin@ftp-tester-2 : acts as client
  • Ensure that server has static IP. The easiest way to know if a machine has a static internet IP is :
    • Run the server program on the machine you wish to test for static IP
    • From any other machine telnet <machineInternetIP> <portOnWhichServerIsRUnning=9000>
    • To obtain a machine's internet IP, use curl ifconfig.me
    • It should ideally establish connection, because FTP is based on the telnet protocol. If however, it says No route to Host, then it means the machine is behind a router and NAT is your enemy.
  • Things to keep in mind while creating your VMs for testing -
    • First, create some VM instances on google cloud. Make sure you have free credits.
    • Server needs to have a static IP. In your project, go to VPC network > External IP addresses and reserve static IP address for your machines.
    • On google cloud, all ports are blocked by default. But our ftp-server should be allowed to use ports freely. So we have to add two Firewall rules to allow ingress and egress traffic on all ports on all protocols accessible by all IPs i.e. 0.0.0.0/0
    • Setup ssh login. Then login using ssh <username>@<external-IP>
    • If you don't want to remember external IP's you can also add custom hostnames and resolve them in your /etc/hosts file
    • Then clone the project, make it, and run
    • To connect to server, client needs to know server's static internet ip. That's a pre-requisite.

General Questions

How to analyse what's happening behind the scenes ?

How to analyse

  • Monitoring system calls with strace
    • strace will allow you to monitor relevant system calls as they happen.
    • go to where executable live cd ./bin
    • strace -fe trace=process,network,signal ./bin/server 9000
    • strace -fe trace=process,network,signal ./bin/client 127.0.0.1 9000
  • Monitoring processes, their children, pid, ppid, pgid with ps
    • Use ps fj to see the tree format of all the forks, along with their pid's and ppid's.
  • Generating logs with tee. This is very unpredictable for interactive programs.
    • make | tee logs/makelog.txt
    • ./bin/server | tee logs/serverlog.txt
    • ./bin/client | tee logs/clientlog.txt
  • Hiding all the server logs with output redirection
    • To hide all output from server, send it to the null device
    • ./server &>/dev/null
How is the code in the project formatted ?

How to Format code

  • a chromium based, opinionated.clang-format file is present in project root.
  • This has been used for all the formatting in this project.
  • Set your IDE format settings to file.
  • For VS Code, add these in your setting.json
    "C_Cpp.clang_format_path": "/usr/bin/clang-format-3.8",
    "C_Cpp.clang_format_style": "file",
    "C_Cpp.clang_format_fallbackStyle": "Chromium",
  • Build your own formatter file here
  • Know more about unified formatting across IDE's here
How much work was involved in the project? What's the future scope?
  • The project was divided into a lot of small tasks.
  • The tasks belonged either of the three categories -
    • Must have features,
    • Good to have features, and
    • Future scope.
  • You can find all these details in the extended todo list

About

A client-server Implementation of the File Transfer Protocol closely following RFC-959 and Beej's Guide.

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages