Push to master for current working build #2

Merged
Trianta merged 8 commits from dev into master 2023-10-03 22:05:27 -05:00
4 changed files with 137 additions and 88 deletions
Showing only changes of commit 9e94f77a83 - Show all commits

View File

@ -1,8 +1,9 @@
add_executable(proxy
./proxy.cpp
./network.cpp
)
add_executable(web_server add_executable(web_server
./web_server.cpp ./web_server.cpp
) )
add_executable(proxy
./proxy.cpp
)

80
src/network.cpp Normal file
View File

@ -0,0 +1,80 @@
#include "network.hpp"
#include <arpa/inet.h>
#include <stdlib.h> // Needed for exit()
#include <iostream>
void HandleClient(int browser_s, int server_s) {
char in_buf[BUF_SIZE]; // Input buffer for GET resquest
char out_buf[BUF_SIZE]; // Output buffer for HTML response
ssize_t buf_len; // Buffer length for file reads
// Pass GET along from browser to server
do {
buf_len = recv(browser_s, in_buf, BUF_SIZE, 0);
send(server_s, in_buf, buf_len, 0);
} while (buf_len != 0);
// Pass response along from server to browser
do {
buf_len = recv(server_s, out_buf, BUF_SIZE, 0);
send(browser_s, out_buf, buf_len, 0);
} while (buf_len != 0);
close(server_s);
close(browser_s);
}
Client::Client(void) {
addressLength = sizeof(address);
address.sin_family = AF_INET;
}
bool Client::ConnectFrom(int socketFD) {
socketFD = accept(socketFD, (struct sockaddr *)&address, &addressLength);
if (socketFD == -1) { return 1; }
return 0;
}
bool Client::ConnectTo(int portNumber) {
std::cout << "Attempting to connect to " << kWebserverIP << " on " << portNumber << std::endl;
address.sin_port = htons(portNumber);
if (inet_pton(address.sin_family, kWebserverIP, &address.sin_addr) <= 0) {
std::cerr << "ERROR (info) - inet_pton" << std::endl;
return 1;
}
socketFD = socket(address.sin_family, SOCK_STREAM, 0);
if (connect(socketFD, (struct sockaddr *)&address, addressLength) == -1) {
std::cerr << "ERROR (info) - connect" << std::endl;
return 1;
}
std::cout << "Connection successful" << std::endl;
return 0;
}
Server::Server(int portNumber) {
address.sin_family = AF_INET;
address.sin_port = htons(portNumber);
address.sin_addr.s_addr = htonl(INADDR_ANY);
}
void Server::Open(void) {
std::cout << "Opening the server" << std::endl;
// Create a socket, fill-in address information, and then bind it
socketFD = socket(address.sin_family, SOCK_STREAM, 0);
if (socketFD == -1)
{
std::cerr << "ERROR - Unable to create socket on server" << std::endl;
exit(1);
}
if (bind(socketFD, (struct sockaddr *)&address, sizeof(address)) == -1)
{
std::cerr << "ERROR - Unable to bind socket" << std::endl;
exit(1);
}
// Listen for connections and then accept
listen(socketFD, 100);
}
void Server::Close(void) {
std::cout << "Closing the server" << std::endl;
close(socketFD);
}

32
src/network.hpp Normal file
View File

@ -0,0 +1,32 @@
#ifndef NETWORK_HPP
#define NETWORK_HPP
#include <netinet/in.h>
#include <unistd.h>
#define BUF_SIZE 4096 // Buffer size (big enough for a GET)
#define kProxyPort 9080
#define kWebserverIP "127.0.0.1"
#define kWebserverPort 7080
void HandleClient(int browser_s, int server_s);
struct Client {
unsigned int socketFD; // Client socket descriptor
sockaddr_in address; // Client IP address
socklen_t addressLength; // Internet address length
Client(void);
bool ConnectFrom(int socketFD);
bool ConnectTo(int portNumber);
};
struct Server {
unsigned int socketFD; // Server socket descriptor
sockaddr_in address; // Server Internet address
Server(int portNumber);
void Open(void);
void Close(void);
};
#endif

View File

@ -1,17 +1,9 @@
//----- Include files --------------------------------------------------------- //----- Include files ---------------------------------------------------------
#include <stdlib.h> // Needed for exit() #include <algorithm>
#include <string.h> // Needed for strcpy() and strlen()
#include <fcntl.h> // Needed for file i/o constants
#include <sys/stat.h> // Needed for file i/o constants
#include <future> #include <future>
#include <iostream> #include <iostream>
#include <vector>
#include <sys/types.h> // #include "network.hpp"
#include <netinet/in.h> //
#include <sys/socket.h> //
#include <arpa/inet.h> //
#include <unistd.h>
//----- HTTP response messages ---------------------------------------------- //----- HTTP response messages ----------------------------------------------
#define OK_IMAGE "HTTP/1.0 200 OK\nContent-Type:image/gif\n\n" #define OK_IMAGE "HTTP/1.0 200 OK\nContent-Type:image/gif\n\n"
@ -19,88 +11,32 @@
#define NOTOK_404 "HTTP/1.0 404 Not Found\nContent-Type:text/html\n\n" #define NOTOK_404 "HTTP/1.0 404 Not Found\nContent-Type:text/html\n\n"
#define MESS_404 "<html><body><h1>FILE NOT FOUND</h1></body></html>" #define MESS_404 "<html><body><h1>FILE NOT FOUND</h1></body></html>"
//----- Defines -------------------------------------------------------------
#define BUF_SIZE 4096 // Buffer size (big enough for a GET)
#define PORT_NUM 9080 // Port number for a Web server
//----- Function prototypes -------------------------------------------------
void BrowserToServer(int browser_s, int server_s);
void ServerToBrowser(int server_s, int browser_s);
//===== modeule main ========================================================
int main(void) int main(void)
{ {
unsigned int proxy_s; // Server socket descriptor std::vector<std::future<void>> pending_futures;
struct sockaddr_in proxy_addr; // Server Internet address Server proxy(kProxyPort);
unsigned int browser_s; // Client socket descriptor Client browser;
struct sockaddr_in browser_addr; // Client Internet address Client webserver;
struct in_addr browser_ip_addr; // Client IP address
unsigned int server_s; // Client socket descriptor
struct sockaddr_in server_addr; // Client Internet address
struct in_addr server_ip_addr; // Client IP address
socklen_t addr_len; // Internet address length
// Create a socket, fill-in address information, and then bind it proxy.Open();
proxy_s = socket(AF_INET, SOCK_STREAM, 0);
if (proxy_s == -1)
{
std::cerr << "ERROR - Unable to create socket on server" << std::endl;
exit(1);
}
proxy_addr.sin_family = AF_INET;
proxy_addr.sin_port = htons(PORT_NUM);
proxy_addr.sin_addr.s_addr = htonl(INADDR_ANY);
int bindRet = bind(proxy_s, (struct sockaddr *)&proxy_addr, sizeof(proxy_addr));
if (bindRet == -1)
{
std::cerr << "ERROR - Unable to bind socket" << std::endl;
exit(1);
}
// Listen for connections and then accept
listen(proxy_s, 100);
// Main loop to listen, accept, and then spin-off a thread to handle the GET // Main loop to listen, accept, and then spin-off a thread to handle the GET
while (1) while (1)
{ {
addr_len = sizeof(browser_addr); if (browser.ConnectFrom(proxy.socketFD) != 0)
{
browser_s = accept(proxy_s, (struct sockaddr *)&browser_addr, &addr_len);
if (browser_s == -1)
{
std::cerr << "ERROR - Unable to create socket to client" << std::endl; std::cerr << "ERROR - Unable to create socket to client" << std::endl;
continue; continue;
} }
std::cout << "Got here" << std::endl; if (webserver.ConnectTo(kWebserverPort) != 0)
unsigned int server_s = socket(AF_INET, SOCK_STREAM, 0); {
connect(server_s, (struct sockaddr *)&server_addr, addr_len); std::cerr << "ERROR - Unable to connect to webserver" << std::endl;
continue;
std::async(std::launch::async, BrowserToServer, browser_s, server_s); }
std::async(std::launch::async, ServerToBrowser, server_s, browser_s); auto newThreadRequest = std::async(std::launch::async, HandleClient, browser.socketFD, webserver.socketFD);
pending_futures.push_back(std::move(newThreadRequest));
} }
close(proxy_s); proxy.Close();
return (1); return 0;
} }
void BrowserToServer(int browser_s, int server_s) {
char in_buf[BUF_SIZE]; // Input buffer for GET resquest
ssize_t buf_len; // Buffer length for file reads
// Pass GET along from browser to server
do {
buf_len = recv(browser_s, in_buf, BUF_SIZE, 0);
send(server_s, in_buf, buf_len, 0);
} while (buf_len != 0);
}
void ServerToBrowser(int server_s, int browser_s) {
char out_buf[BUF_SIZE]; // Output buffer for HTML response
ssize_t buf_len; // Buffer length for file reads
// Pass response along from server to browser
do {
buf_len = recv(server_s, out_buf, BUF_SIZE, 0);
send(browser_s, out_buf, buf_len, 0);
} while (buf_len != 0);
close(server_s);
close(browser_s);
}