Virtual Machines and Networks
These projects showcase some of my basic IT work, including operating system installation and network setup. In these images, you'll see virtual machines running Arch Linux and TinyCore Linux. Additionally, I developed a file transfer applications for both the client and server to allow for image downloading.
This project demonstrates how a web client communicates with a web server by requesting an HTTP webpage. The process begins when the client sends a DHCP request to obtain an IP address and network configuration from a DHCP server. The server responds with an offer containing the client’s IP and the DNS server address. The client confirms the offer, and the DHCP server finalizes the lease. Once the client has the necessary network settings, it uses the provided DNS server to resolve domain names. When the client enters a URL in the browser, it sends a DNS query to the server to find the corresponding IP address. The DNS server either returns the cached IP or performs a lookup to resolve the domain.
Leveraging Berkeley sockets and RFC 5905, I developed a system for reliable file download communication between the client and server. This implementation demonstrates my proficiency in network programming and low-level socket management.
If you wish to learn more about Berkley sockets, please check out Beej's guide here.
My project followed the specifications outlined in RFC 5905 as seen here.
I'd like to highlight one of the many processes involved in developing these applications—specifically, the server-side function enteringIntoPassive
.
The enteringIntoPassive
function is part of an FTP server implementation that transitions the server into passive mode for data transfer. The function first attempts to start a listener for incoming data connections using startPassiveListener
. It then checks whether this operation was successful. The server constructs a response message using createPassiveSuccessResponse
, which includes details such as the port number where the server is listening for data connections. This message is sent to the client over the control connection using sendToRemote
. The server then verifies if the listener socket is ready to accept a connection by calling isListenerSocketReady
, which also manages timeout and error states. If the listener is ready, the server accepts the incoming connection using acceptClientConnection
. Finally, the passive listener is stopped with stopPassiveListener
, and a success response is prepared.
While many additional processes are involved, this example should provide a sufficient understanding of the work required.